《c陷阱與缺陷》 編程者也許認為,程式一旦執行上述操作完畢,就可以自由地進行讀取和寫入的操作了。遺憾的是,事實總難遂人所願,為了保持與過去不能同時進行讀寫操作的程式的向下相容性,一個輸入操作不能隨後直接緊跟輸出操作,反之亦然。如果同時進行輸入和輸出操作,必須在其中插入fseek函數調用。 這個陷阱把 ...
《c陷阱與缺陷》
FILE *fp;
fp = fopen(file, "r+");
編程者也許認為,程式一旦執行上述操作完畢,就可以自由地進行讀取和寫入的操作了。遺憾的是,事實總難遂人所願,為了保持與過去不能同時進行讀寫操作的程式的向下相容性,一個輸入操作不能隨後直接緊跟輸出操作,反之亦然。如果同時進行輸入和輸出操作,必須在其中插入fseek函數調用。
這個陷阱把我坑了一把,所以將c庫函數文件操作學習整理一番,方便自己以後查閱。
- FILE結構體
在stdio.h中定義的FILE結構體。
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件輸入下一個位置
int _cnt; //當前緩衝區相對位置
char *_base; //文件起始位置
int _flag; //文件標誌
int _file; //文件描述符
int _charbuf; //檢查緩衝區狀況,如果無緩衝區則不讀取
int _bufsiz; //緩衝區大小
char *_tmpfname; //臨時文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
- 文件的打開
FILE *fopen(const char *path, const char *mode);
1.功能
按照mode規定的方式去打開path里指定文件。
2.參數
path是個字元指針,指向打開或建立文件的字元串
mode是指向文件處理的字元串的指針
3.返回值
正常:被打開文件的FILE指針
異常:NULL,未成功打開
- 文件的關閉
int fclose(FILE *fp);
1.功能
關閉由fp指出的文件,調用操作系統提供的文件關閉功能。
2.參數
fp:打開文件的FILE指針
3.返回值
正常:0
異常:EOF
- 文件讀取
①字元讀取
int fgetc(FILE *stream);
1.功能
從stream所指文件中讀取一個字元
2.參數
stream:要讀取字元文件的FILE指針
3.返回值
正常:返回讀取字元
異常:返回EOF
②字元串讀取
char *fgets(char *s, int size, FILE *stream);
1.功能
從stream中讀取大小為size-1的字元,最後加上字元串結束符'\0'
2.參數
s:接收字元串的地址,數組或是指針
size:讀取字元大小
stream:讀取的文件的FILE指針
3.返回值
正常:字元串首地址(char *s的地址)
異常:NULL
使用feof或是ferror去判別是否到達文件尾部和發生錯誤。
- 文件的寫入
①字元寫入
int fputc(int c, FILE *stream);
1.功能
把字元c寫入stream指向的文件
2.參數
c:字元
stream:寫入的文件的FILE指針
3.返回值
正常:寫入字元
異常:EOF
②字元串的寫入
int fputs(const char *s, FILE *stream);
1.功能
將str寫入stream指向的文件中
2.參數
s:寫入字元串
stream:要寫入字元串的文件的FILE指針
3.返回值
正常:寫入的字元串長度
異常:返回NULL
使用feof或是ferror去判別是否到達文件尾部和發生錯誤。
③格式化數據寫入
int fprintf(FILE *stream, const char *format, ...);
1.功能
與printf功能相同,寫入文件中
2.參數
stream:寫入的文件的FILE指針
format:字元串指針,其中包含寫入數據的格式
3.返回值
無
- 二進位形式的讀寫
①二進位形式讀取文件數據
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
1.功能
按二進位形式將stream指向的文件的size*nmemb的數據讀到ptr數據區去
2.參數
ptr:viod指針類型,讀到數據存放的首地址
size:數據塊的大小,位元組數
nmemb:一次讀多少數據塊
stream:要讀取數據文件的FILE指針
3.返回值
正常:實際讀取數據塊個數
異常:0(具體通過feof()和ferror()判定)
②二進位形式寫數據
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
與fread相反
③二進位形式讀取一個整數
int getw(FILE *stream);
④二進位形式寫入一個整數
int putw(int w, FILE *stream);
- 文件狀態檢查
①文件結束
int feof(FILE *stream);
1.功能
判斷文件是否結束
2.返回值
0:文件未結束
1:文件結束
②文件讀寫出錯
int ferror(FILE *stream);
1.功能
檢查讀寫stream指向的文件是否出錯
2.返回值
0:無錯誤
1:出錯
③錯誤標誌清除
void clearerr(FILE *stream);
1.功能
清楚stream指向的文件的錯誤標誌
- 文件的操作的文件
①當前文件位置
long ftell(FILE *stream);
1.功能
文件開頭與當前的偏移量
2.返回值
正常:位移量
異常:-1
②倒帶
void rewind(FILE *stream);
1.功能
文件位置指針重新指向開頭
③fseek
int fseek(FILE *stream, long offset, int whence);
1.功能
使文件定位移到指定位置:基於whence的相對offest位置處
2.參數
offset:位元組位移量
whence:
SEEK_SET 0 文件開頭
SEEK_CUR 1 文件當前位置
SEEK_END 2 文件末尾
3.返回值
正常:當前位置
異常:-1
- exit()函數
void exit(int status);
1.功能
使程式立即終止執行,將緩衝區數據輸出並關閉所有打開文件
2.參數
0:正常終止
作者:Devil-wei
出處:https://www.cnblogs.com/Devil-wei/
版權聲明:本文版權歸作者,轉載請標註文章作者與出處