1. 程式人生 > >fopen\fread\fwrite\fscanf\fprintf\fseek\feof\rewind\fgets\fputc等系列函式使用總結

fopen\fread\fwrite\fscanf\fprintf\fseek\feof\rewind\fgets\fputc等系列函式使用總結

1 fopen 函式原型:FILE * fopen(const char * path,const char * mode); 返回值:檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。 fopen_s,_wfopen_s安全性上相對於fopen有所增強,如果成功則返回0,失敗則返回響應的錯誤程式碼 errno_t fopen_s( FILE** pFile, const char *filename, const char *mode ); errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode );
 

使用檔案的方式共有12種

方式

意 義

"rt"

只讀開啟 文字檔案

"wt"

只寫開啟或建立 文字檔案

"at"

追加開啟 文字檔案

"rb"

只讀開啟 二進位制檔案

"wb"

只寫開啟或建立 二進位制檔案

"ab"

追加開啟 二進位制檔案

"rt+"

讀寫開啟 文字檔案

"wt+"

讀寫開啟或建立 文字檔案

"at+"

讀寫開啟文字檔案,可追加

"rb+"

讀寫開啟二進位制檔案

"wb+"

讀寫開啟或建立二進位制檔案

"ab+"

讀寫開啟二進位制檔案,可追加

說明:

1. 檔案使用方式由r,w,a,t,b,+六個字元拼成,各字元的含義是:

r(read) 讀                       w(write)  寫             a(append) 追加      + 讀和寫

t(text) 文字檔案,可省略不寫     b(banary)  二進位制檔案

2. 用"r"開啟的檔案只能讀,且檔案必須已經存在

3. 用"w"開啟的檔案只能寫。若檔案不存在,建立之否則,覆蓋之。

4. 用"a"開啟的檔案只能寫,內容追加。檔案必須已經存在,否則出錯。

5. 開啟檔案出錯,fopen將返回 NULL。

6. 對於文字檔案,讀入記憶體時轉換為二進位制形式,寫入硬碟時轉換為文字形式,轉換需要一點

點時間。對二進位制檔案的讀寫不存在這種轉換。

7. 檔案使用完畢,應關閉之,以避免資料丟失等錯誤。

8. 標準輸入檔案(鍵盤),標準輸出檔案(顯示器 ),標準出錯輸出(出錯資訊)由系統開啟,可直接使用。

2 fread和fwrite 函式原型:size_t fread ( void   *buffer,  size_t size,  size_t count,  FILE *stream) ; 功 能:從一個檔案流中讀資料,最多讀取count個元素,每個元素size位元組,如果呼叫成功返回實際讀取到的元素個數,如果不成功返回 0。 參 數: buffer用於接收資料的記憶體地址,大小至少是size*count位元組.         size單個元素的大小,單位是位元組         count元素的個數,每個元素是size位元組.         stream輸入流 返回值:實際讀取的元素個數.如果返回值與count不相同,則可能檔案結尾或發生錯誤. 函式原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意:這個函式以二進位制形式對檔案進行操作,不侷限於文字檔案 (1)buffer:是一個指標,對fwrite來說,是要獲取資料的地址; (2)size:要寫入內容的單位元組數; (3)count:要進行寫入size位元組的資料項的個數; (4)stream:目標檔案指標; (5)返回實際寫入的資料項個數count。 說明:寫入到檔案的哪裡? 這個與檔案的開啟模式有關,如果是w+,則是從file pointer指向的地址開始寫,替換掉之後的內容,檔案的長度可以不變,stream的位置移動count個數;如果是a+,則從檔案的末尾開始新增,檔案長度加大。 fseek對此函式有作用,但是fwrite函式寫到使用者空間緩衝區,並未同步到檔案中,所以修改後要將記憶體與檔案同步可以用fflush(FILE *fp)函式同步。 fwrite一般用來寫入char*,int*不能直接寫。 因為通常我們寫入int到檔案希望看到效果是一個數,如1,2,3等。但是int佔2個或4個位元組,用fwrite寫入時,一個int是按2個或4個位元組寫到檔案中的,而檔案顯示時是按一個位元組一個位元組的顯示內容,它不會把4個位元組連續起來顯示,所以它不可能是1,2,3這樣的單字元字樣。除了格式化輸入fprintf外,還可以進行型別轉換,如下所示,但是讀取的時候不能使用fread了,只能使用fscanf或fscanf_s函式。  char tmp[100] = {0};_itoa_s(int, tmp, 10); fwrite(tmp, strlen(tmp), 1, file); fwrite("\t", 1, 1, file);memset(sbuf,0,100); 相對於使用格式化輸入,如果迴圈寫資料的話上面的寫法較為繁瑣了些(5句話使用1句話就可以代替了) fprintf(file, "%d ", int); 3 fprintf和fscanf

    int fprintf(FILE *stream,const char *format,[argument]) 

fprintf()函式根據指定的format(格式)傳送資訊(引數)到由stream(流)指定的檔案. fprintf()只能和printf()一樣工作. fprintf()的返回值是輸出的字元數,發生錯誤時返回一個負值.

%d 十進位制有符號整數

%i 一個整數

%u 十進位制無符號整數

%f 浮點數

%s 字串

%c 單個字元

%p指標的值

%e 指數形式的浮點數

%x, %X 無符號以十六進位制表示的整數

%o 無符號以八進位制表示的整數

%g 自動選擇合適的表示法

%n 等於讀取字元數量的整數

%[] 一個字符集

%% 一個精度符號

int fscanf(FILE* stream,const char *format,[argument...]);

返回值:整型,成功讀入的引數的個數

int fscanf_s(FILE* stream,const char *format,[argument...]);

4 fclose,ferror,feof

fclose(檔案指標)正常關閉返回0,否則返回非零。

從ferror和feof獲取錯誤資訊或檢測是否到達檔案結尾

feof檔案結束返回非0,否則返回0

5 fseek

int fseek( FILE *stream, long offset, int origin );

第一個引數stream為檔案指標

第二個引數offset為偏移量,正數表示正向偏移,負數表示負向偏移

第三個引數origin設定從檔案的哪裡開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET檔案開頭  SEEK_CUR當前位置SEEK_END檔案結尾

6 rewind,ftell 原型:void rewind(FILE *stream); 功能:將檔案指標重新指向一個流的開頭,等同於fseek(stream, 0L, SEEK_SET) 原型:long ftell(FILE *fp) 功能:得到流式檔案的當前讀寫位置,其返回值是當前讀寫位置偏離檔案頭部的位元組數。 例子:一般我們會通過下面的方法來獲取檔案中字元的個數:     FILE *fs=fopen("C:\1.txt","r");//建立檔案流     fseek(fs,0,SEEK_END);//將檔案內部指標放到檔案最後面     length=ftell(fs);//讀取檔案指標的位置,得到檔案字元的個數     rewind(fs);//將檔案指標重置到檔案最前面 7 fgetc/fputc/fgets/fputs

fgetc函式

 (1)一般呼叫形式  ch=fgetc(fp);

(2)作用 從指定的檔案讀入一個字元,即從fp所指向的檔案中讀入一個字元賦給ch。

(3)返回值

        成功:返回值所得到的字元;       失敗:返回EOF(-1)。

fputc函式

(1)一般呼叫形式  fputc(ch,fp);

(2)作用  把一個字元寫到磁碟檔案上去,即將字元ch輸出到fp所指向的檔案中去。

(3)返回值

        成功:返回值就是輸出的字元;     失敗:返回EOF(-1)。

說明:函式putchar()是在stdio.h中用預處理命令定義的巨集,即:

#define putchar(c)     fputc(c,stdout)

char *fgets(char *str, int num, FILE *fp)

引數說明:str: 儲存從檔案讀取出來的字串      

          fp: 待讀檔案的檔案指標

          num: 表示從檔案中讀出的字串不超過 n-1個字元。在讀入的最後一個字元後加上串結束標誌'\0'

int fputs(const char * s,FILE * stream)

功 能:向指定的檔案寫入一個字串(不自動寫入字串結束標記符‘\0’)。成功寫入一個字串後,檔案的位置指標會自動後移,函式返回為一個非負整數;否則返回EOF(符號常量,其值為-1)。