fopen\fread\fwrite\fscanf\fprintf\fseek\feof\rewind\fgets\fputc等系列函式使用總結
使用檔案的方式共有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和fscanfint 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,feoffclose(檔案指標)正常關閉時返回0,否則返回非零。
從ferror和feof獲取錯誤資訊或檢測是否到達檔案結尾
feof檔案結束返回非0,否則返回0
5 fseekint 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/fputsfgetc函式
(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)。