第一節 認識文件
-
文件:通常計算機包含各種不同類型的文件,例如照片、音樂、
.c
文件等。文件包含程序文件
和數據文件
。將數據的輸入和輸出的過程稱爲數據流
。一個文件包含文件路徑、文件標識符、文件後綴,例如D:\C_program\8\Debug\7.exe
,後綴名exe(可執行文件)、txt(文本文件)、doc(word文件)、mp4(視頻文件)、mp3(音頻文件)。 -
文件的分類:數據文件分爲
ASCII文件
和二進制文件
,數據在內存中是以二進制
的形式進行存儲的。 -
文件緩衝區:從磁盤中讀取數據,會先將數據存儲到輸入文件緩衝區中,等文件緩衝區裝滿了以後發送到程序數據區;輸出文件到磁盤中,會現將數據存儲到輸出文件緩衝區中,等文件緩衝區裝滿了以後再發送給磁盤。
第二節 文件的操作
-
對文件的操作方法
-
打開文件
打開文件不同於操作系統打開文件,打開文件的方法爲:
fopen(文件名, 操作模式)
,fopen
爲打開函數,文件名
爲需要打開的文件,操作模式
爲需要對文件進行何種操作。一旦文件被打開,在內存中開闢區域存放文件的有關信息(如文件的名字、文件的位置、文件的狀態等)並返回此信息。定義一個FILE類型的指針變量指向被打開文件,可以將文件信息和指針變量進行關聯。之後都可以對文件型指針變量進行操作,打開文件的常用方法爲:FILE *fp fp = fopen(文件名, 操作模式)
-
操作模式:
- “r” :讀模式,允許對文件讀取信息。若文件名不正確,則報錯;
- “w” :寫模式,允許向文件寫入信息。若文件不存在,則創建一個文件;
- “a” :追加模式,允許在文件末尾添加信息。若文件名不正確,則報錯;
- “rb” “wb” “ab” 打開二進制文件,其他與以上3個相同;
- “r+” “w+” "a+"允許對文件讀取和寫入信息,其他與前3個相同;
- “rb+” “wb+” "ab+"允許對文件讀取和寫入信息,打開二進制文件,其他與前3個相同。
-
關閉文件
fclose(文件指針)
文件使用後需要關閉文件,如果沒有及時關閉文件可能會導致數據丟失,關閉成功返回一個數值0,否則返回EOF(-1)
第三節 文件的讀寫
-
文件打開之後,根據文件的打開模式,可以進行讀寫。
-
向文件讀取字符
fgetc(fp)
功能:從fp指向的文件獲取一個字符。如果讀取成功返回獲取的字符,讀取失敗則返回文件結束標誌EOF(-1)
-
向文件寫入字符
fputc(c, fp)
功能:向fp指向的文件寫入一個字符。如果寫入成功則返回寫入的字符,寫入失敗則返回文件結束標誌EOF(-1)
-
向文件讀取字符串
fgets(str, n, fp)
,功能:從fp指向的文件獲取一個長度爲n-1的字符串,並一次性存入到str字符數組中。如果讀取成功返回str指針,讀取失敗則返回NULL
注意:
- 讀取的
n-1
個字符,最後加上一個結束標誌\0
,一共n個字符串; - 遇到換行符或文件結束標誌EOF,則將之前的內容存儲到str中,不再繼續讀取字符,表示本次讀取結束(最多讀取一行)。
- 讀取的
-
向文件寫入字符串
fputs(str, fp)
功能:將str字符數組中的內容(字符串)寫入到fp指向的文件中,如果寫入成功返回數字0,寫入失敗則返回非0的數字。
-
格式化讀寫內容
fprintf(文件指針, 格式字符串, 輸出表列)
fscanf(文件指針, 格式字符串, 輸入表列)
與printf、scanf函數相同,不同點在於不是輸出到黑框的終端或者在終端輸入信息,而是向文件寫入信息或讀取信息。
-
向文件讀取一個數據塊
讀取數據時,數據不經過轉換的讀取到內存中。
fread(buffer, size, count, fp) 參數: buffer:讀取的數據存入內存地址 size:讀取的字節大小 count:讀取數據的個數 fp:讀取的文件指針 返回值:返回讀取數據的個數
-
向文件寫入一個數據塊
寫入數據時,數據不經過轉換的讀取到內存中。
fwrite(buffer, size, count, fp) 參數: buffer:待寫入的內存地址buffer size:寫入的字節大小 count:寫入數據的個數 fp:寫入的文件指針
-
注意:
- 由於fread、fwrite函數讀寫數據時不會轉換數據,因此讀取速度快;
- 讀取二進制文件一般使用fread、fwrite函數;
- fgetc、fputc、fgets、fputs、fprintf、fscanf函數是讀寫字符數據,不建議用讀取二進制文件。
第四節 改變文件讀寫位置
-
思考:
文件的讀寫總是從文件的開頭起始,一直讀寫到最後,但如果文件內容較多,只需要獲取某個文件指定位置的數據,這種方法就比較麻煩。不能快速獲取指定位置數據。
-
文件讀寫指針:
文件讀寫標記記錄訪問的位置
-
rewind
函數將讀寫指針重新指向文件開頭rewind(fp) //將fp指向的文件讀寫指針重新指向文件開頭
-
fseek
函數指定文件讀寫指針位置fseek(文件指針, 位移量, 起始點) 起始點: 0 表示文件開始位置 1 表示當前讀寫指針位置 2 表示文件末尾位置
第五節 文件操作錯誤檢查
讀寫函數是否存在錯誤,除了使用函數的返回值來檢驗以外,還可以使用錯誤檢查讀寫函數是否正確執行。
-
ferror函數
ferror(fp) //返回值爲0表示讀寫正確 //返回值爲1表示讀寫錯誤
-
clearerr函數
將文件錯誤標誌和文件結束標誌置爲0。當
ferror
檢查到讀寫函數出現錯誤,此時應當立即調用clearerr(fp)
,使得下一輪能正常使用ferror
函數進行檢查。