FILE文件流用於對文件的快速操作,主要的操作函數有fopen、fseek、fread、fclose,在對文件結構比較清楚時使用這幾個函數會比較快捷的得到文件中具體位置的數據,提取對我們有用的信息,滿足編程中的需要。以下分別進行說明,還有他們使用時的注意事項
fopen
函數原型 FILE * fopen(const char *path,cost char *mode)
作用:打開一個文件,返回指向該文件的指針
參數說明:第一個參數為欲打開文件的文件路徑及文件名,第二個參數表示對文件的打開方式
注:mode有以下值:
r:只讀方式打開,文件必須存在
r+:可讀寫,必須存在
rb+:打開二進制文件,可以讀寫
rt+:打開文本文件,可讀寫
w:只寫,文件存在則文件長度清0,文件不存在則建立該文件
w+:可讀寫,文件存在則文件長度清0,文件不存在則建立該文件
a:附加方式打開只寫,不存在建立該文件,存在寫入的數據加到文件尾,EOF符保留
a+:附加方式打開可讀寫,不存在建立該文件,存在寫入的數據加到文件尾,EOF符不保留
wb:打開二進制文件,只寫
wb+:打開或建立二進制文件,可讀寫
wt+:打開或建立文本文件,可讀寫
at+:打開文本文件,可讀寫,寫的數據加在文本末尾
ab+:打開二進制文件,可讀寫,寫的數據加在文件末尾
由mode字符可知,上述如r、w、a在其後都可以加一個b,表示以二進制形式打開文件
返回值:文件打開了,返回一個指向該打開文件的指針(FILE結構);文件打開失敗,錯誤上存error code(錯誤代碼)
注意:在fopen操作後要進行判斷,是否文件打開,文件真正打開了才能進行後面的讀或寫操作,如有錯誤要進行錯誤處理
例:FILE *pfile=fopen(const char *filename,"rb");
打開文件流還有一個支持寬字符的函數,如下
FILE *_wfopen(const wchar_t *filename,const wchar_t *mode)
fread
函數原型:size_t fread(void* buff,size_t size,size_t count,FILE* stream)
作用:從文件中讀入數據到指定的地址中
參數:第一個參數為接收數據的指針(buff),也即數據存儲的地址
第二個參數為單個元素的大小,即由指針寫入地址的數據大小,注意單位是字節
第三個參數為元素個數,即要讀取的數據大小為size的元素個素
第四個參數為提供數據的文件指針,該指針指向文件內部數據
返回值:讀取的總數據元素個數
例:
int num,count;
int* pr=new int[num*count];
fread(pr, num*4, count, stream); // stream為fopen中返回的FILE指針
要將數據寫入pr中,必須為pr分配內存,一個int為4個字節,所以要x4
fseek
函數原型:int fseek(FILE *stream,long offset,int framewhere)
作用:重定位文件內部的指針
參數:第一個為文件指針,第二個是指針的偏移量,第三個是指針偏移起始位置
返回值:重定位成功返回0,否則返回非零值
需要注意的是該函數不是重定位文件指針,而是重定位文件內部的指針,讓指向文件內部數據的指針移到文件中我們感興趣的數據上,重定位主要是這個目的。
說明:執行成功,則stream指向以fromwhere為基准,偏移offset個字節的位置。執行失敗(比方說offset偏移的位置超出了文件大小),則保留原來stream的位置不變
fclose
函數原型:int fclose(FILE *stream)
功能:關閉一個文件流,使用fclose就可以把緩沖區內最後剩余的數據輸出到磁盤文件中,並釋放文件指針和有關的緩沖區
熟練使用以上四個函數可以從文件中獲取對我們有用的數據型,前提對於文件格式很了解,比如,對於一個DIB位圖文件,就可以讀取出他的文件中的頭信息和像素點信息。