1. 程式人生 > >C++檔案操作函式-讀寫檔案

C++檔案操作函式-讀寫檔案

檔案讀寫是基礎中的基礎,關於此類知識的文章非常多,但還是想根據自己的使用心得去總結這麼一些內容。

1.檔案的開啟和關閉

開啟和關閉

fopen()函式

FILE *fopen(char *filename, *type);

filename:可以包含 路徑 和 檔名 兩部分。如:“TEST.dat”、“C:\tc\TEST.dat”
type:
“r”開啟檔案只讀。
“w”建立文字檔案只寫。
“a”增補,如果檔案不存在則建立一個。
“r+”開啟一個文字檔案讀/寫。
“w+”建立一個文字檔案讀/寫。
“a+”開啟或建立一個檔案增補。
“b”二進位制檔案(可以和以上每一項合併用)。
“t”文字檔案(預設項)。
返回值:成功開啟檔案則返回檔案指標;否則返回空指標(NULL)

例:
FILE *fp = fopen(strDEMFile.c_str(),_T("r"));//UNICODE以讀方式開啟檔案
【strDEMFile 是const string型別】
另有:fopen_s()函式
FILE*fp;
fopen_s(&fp,strfileName.GetBuffer(),_T(“r”));//不能直接FILE *fp = fopen_s……
【strfileName是CString型別,應該也可以是string型別,但不能用const修飾!】

關閉

fclose()函式

int fclose(FILE *stream);//當檔案關閉成功時,返回0,否則返回一個非0值;
GetBuffer(); 本函式常見於檔案的開啟等資料操作,由於在很多情況下需要路徑是const string型別,但路徑變數又是非常量。用法見上

檔案的讀寫操作

檔案的順序寫

fprintf()函式

int fprintf (FILE *stream, const char *format,)
FILE *stream:檔案指標
const char *format:輸出格式
< variable-list >(輸出變數列表)
返回值: 是輸出的字元數,發生錯誤時返回EOF(值為-1)。
例:
fprintf (fp,"%d\n", i);//向檔案寫入一個整型 變數i

fputs()-fputc函式

int fputs ( const char * str, FILE * stream );//向檔案寫入一個字串
str:可以是字元型指標 或者 字串常量
FILE *stream:檔案指標
返回值:是輸出的字元數,發生錯誤時返回EOF(值為-1)。
例:
fputs ("FuckWorld!\n", fp);

int fputc ( int c, FILE *stream );//向檔案寫入一個字元
c:可以是字元
FILE *stream:檔案指標
返回值:是輸出的字元數,發生錯誤時返回EOF(值為-1)。
例:

char strptr1[] = "This is a test of fputc!!\n";
char *p;
p = strptr1;
while( (*p != '\0') && fputc(*(p++), fp) != EOF ) ;//這句話寫的挺漂亮的

fscanf()函式

int fscanf ( FILE *stream, const char *format, );//順序讀取檔案,遇空格和換行符結束
FILE *stream:檔案指標
const char *format:輸出格式
(輸出變數列表)
返回值:成功,返回讀入引數的個數;失敗,返回EOF(值為-1)
例:
fscanf(fp, “%d”, &n);//加取地址符&
fscanf(fp, “%s”, s);//注意:讀入字串時不要取地址符!【s 為char型,如:char s[10];】
另有:fscanf_s()
例:fscanf_s(fp, “%lf %lf”, &dX, &dY);//獲取X,Y座標【lf-double】

fgets()函式

char *fgets ( char *buf, intbufsize, FILE *stream );//按順序讀bufsize個字串,遇到換行符結束
*buf:字元型指標,指向用來儲存所得資料的地址。
bufsize: 整型資料,指明儲存資料的大小。
FILE *stream:檔案指標
返回值:成功,則返回第一個引數buf;在讀字元時遇到end-of-file,則eof指示器被設定,如果還沒讀入任何字元就遇到這種情況,則buf保持原來的內容,返回NULL;如果發生讀入錯誤,error指示器被設定,返回NULL,buf的值可能被改變。
例:
if( fgets( line, 100, stream ) == NULL)
printf(“fgets error\n” );
else
printf( “%s”, line);//輸出讀取的字串

fgetc()函式

int fgetc(FILE *stream);//按順序讀取檔案,每次讀取一個字元,讀取後,游標位置後移一個位元組。
FILE *stream:檔案指標
返回值:成功,則返回所讀取的一個位元組;失敗,(讀到檔案末尾或出錯)則返回EOF

二進位制檔案的讀寫(隨機讀寫)

常用讀寫方法:

int fseek(FILE * stream, long offset, int fromwhere); //設定檔案指標stream的位置
int fread(void *buf, int size, int count, FILE *stream); //二進位制讀
int fwrite(void *buf, int size, int count, FILE *stream); //二進位制寫
long ftell(FILE *stream); //獲取檔案位置指標當前位置相對於檔案首的偏移位元組數

Tips:
fputs和fwrite函式在輸入’\n’的時候,會最自動在前面新增一個’\r’,這樣會導致最後輸出的文字多一行空行,想要不自動加,則在fopen的時候就指定“b”引數(二進位制檔案)