C語言——文件操作

文件操作

數據的輸入和輸出基本伴隨着整個C程序,輸入就是從“源端”獲取數據,輸出就是向終端寫入數據

文件的分類

計算機上的各種資源都是由操作系統管理和控制的,操作系統中的文件系統,是專門負責將外部存儲設備中的信息組織方式進行統一管理規劃,以便爲程序訪問數據提供統一的方式。
文件是操作系統管理數據的基本單位,文件一般是指存儲在外部存儲介質上的有名字的一系列相關數據的有序集合。它是程序對數據進行讀寫操作的基本對象。在 C 語言中,把輸入和輸出設備都看作文件
  1. 文件一般包括三要素 :文件路徑、文件名、文件後綴;

  2. 文件路徑:可以顯式指出其絕對路徑,如上面的”E:\”或者”E:/”等;如果沒有顯式指出其路徑,默認爲當前路徑。
    C 語言不僅支持對當前目錄和根目錄文件的操作,也支持對多級目錄文件的操作,例如:
    D:\C_WorkSpace\Chapter_10\file_1.txt
    或者
    D:/C_WorkSpace/Chapter_10/file_1.txt
    中的 file_1.txt 均是 C 語言可操作的多級目錄文件。

  3. 文件名:標識文件名字的合法標識符,如 ch10、file_1 等都是合法的文件名。

  4. 後綴:一般用於標明文件的類型,使用方式爲:文件名.後綴,即文件名與後綴之間用 ‘.’ 隔開。常見的 後綴類型有:doc、txt、dat、c、cpp、obj、exe、bmp、jpg 等。

  5. C 語言中的輸入和輸出都是和文件相關的,即程序從文件中輸入(讀取)數據,程序向文件中輸出(寫入)數據。
    文件按其邏輯結構可分爲:記錄文件和流式文件。而記錄文件又可分爲:順序文件、索引文件、索引順 序文件及散列文件等。
    流式文件是以字節爲單位,對流式文件的訪問一般採用窮舉搜索的方式,效率不高,故一般需頻繁訪問的較大數據不適宜採用流式文件邏輯結構。但由於流式文件管理簡單,用戶可以較方便地對文件進行相關操作。

文件的打開和關閉

  1. 打開fopen函數:`FILE * fopen(char *filename, char *mode);

  2. mode:
    模式 含 義 說 明
    r 只讀 文件必須存在,否則打開失敗
    w 只寫 若文件存在,則清除原文件內容後寫入;否則,新建文件後寫入
    a 追加只寫 若文件存在,則位置指針移到文件末尾,在文件尾部追加寫人,故該方式不 刪除原文件數據;若文件不存在,則打開失敗
    r+ 讀寫 文件必須存在。在只讀 r 的基礎上加 ‘+’ 表示增加可寫的功能。下同
    w+ 讀寫 新建一個文件,先向該文件中寫人數據,然後可從該文件中讀取數據
    a+ 讀寫 在” a”模式的基礎上,增加可讀功能
    rb 二進制讀 功能同模式”r”,區別:b表示以二進制模式打開。下同
    wb 二進制寫 功能同模式“w”。二進制模式
    ab 二進制追加 功能同模式”a”。二進制模式
    rb+ 二進制讀寫 功能同模式"r+”。二進制模式
    wb+ 二進制讀寫 功能同模式”w+”。二進制模式
    ab+ 二進制讀寫 功能同模式”a+”。二進制模式

  3. 返回值:打開成功,返回該文件對應的 FILE 類型的指針;打開失敗,返回 NULL。故需定義 FILE 類型的指針變量,保存該函數的返回值。可根據該函數的返回值判斷文件打開是否成功

  4. 關閉fclose函數:int fclose(FILE *fp);返回值:正常關閉,返回否則返回 EOF(-1)

文件的順序讀寫

對文件讀取操作完成後,如果從文件中讀取到的每個數據的順序與文件中該數據的物理存放順序保持一致,則稱該讀取過程爲順序讀取;同理,對文件寫入操作完成後,如果文件中所有數據的存放順序與各個數據被寫入的先後順序保持一致,則稱該寫入過程爲順序寫入

fgetc 函數說明:
作用:從文件指針指向的文件流中讀取一個字符,讀取一個字節後,光標位置後移一個字節
格式:int fgetc(FILE *stream);
返回值:返回所讀取的一個字節,如果讀到文件末尾或者讀取出錯時返回EOF(EOF是文件結束標識符,一般值爲-1)
參數說明:
*stream:文件指針,從該文件指針指向的文件中讀取一個字符,然後將光標後移一個字節

fputc 函數說明:
作用:將指定字符寫到文件指針所指向的文件的當前寫指針位置上
格式:int fputc (char c, File *fp);
返回值:在正常調用情況下,函數返回寫入文件的字符的ASCII碼值,出錯時,返回EOF
參數說明:
c:需要寫入的字符
*fp:文件指針,在當前文件指針所指向的文件的當前寫指針位置上寫入一個字符c,然後文件內部寫指針會自動後移一個字節位置

fgets 函數說明:
作用:從文件結構體指針stream中讀取數據,每次讀取一行。讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦’\0’),如果文件中的該行,不足bufsize個字符,則讀完該行就結束。如若該行(包括最後一個換行符)的字符數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩衝區總是以NULL字符結尾,對fgets的下一次調用會繼續讀該行。
格式:char *fgets(char *buf, int bufsize, FILE *stream);
返回值:函數成功將返回buf,失敗或讀到文件結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數是否是出錯而終止的,應該藉助feof函數或者ferror函數來判斷。
參數說明:
*buf: 字符型指針,指向用來存儲所得數據的地址。
bufsize: 整型數據,指明存儲數據的大小。
*stream: 文件指針,將要讀取的文件流。

fputs 函數說明:
作用:向指定的文件寫入一個字符串(不自動寫入字符串結束標記符‘\0’)
格式:int fputs(char *str, FILE *fp);
返回值:若成功返回0,失敗返回EOF
參數說明:
*str: 需要寫入的字符串
*fp: 文件指針,將要寫入的文件流

fprintf 函數說明:
作用:格式化後輸出到文件中
格式:int fprintf (FILE* stream, const char* format, [argument]);
返回值:若成功返回值是輸出的字符數,當發生錯誤時返回一個負值
參數說明:
*stream:文件指針
*format:輸出格式
[argument]:附加參數列表
注:用法與printf函數類似,這裏只是參數多了一個文件指針,將格式後的結果輸出到文件中

fscanf 函數說明:
作用:從一個流中執行格式化輸入
格式:int fscanf(FILE* stream,constchar* format,[argument]);
返回值:成功返回讀入的參數的個數,失敗返回EOF。
參數說明:
*stream:文件指針
*format:格式字符串
[argument]:輸入列表
注:用法與scanf函數類似

fread 函數說明:
作用:從一個文件流中讀數據,最多讀取count個元素,每個元素size字節
格式:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
返回值:如果調用成功返回實際讀取到的元素個數,如果不成功或讀到文件末尾返回0
參數說明:
*buffer:用於接收數據的內存地址
size:要讀的每個數據項的字節數,單位是字節
count:要讀count個數據項,每個數據項size個字節
*stream:文件指針
注:這個函數以二進制形式對文件進行操作,不侷限於文本文件

fwrite 函數說明:
作用:向文件寫入一個數據塊
格式:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值:返回實際寫入的數據塊數目
參數說明:
*buffer:待寫入的數據的內存地址
size:要寫入內容的單字節數
count:要進行寫入size字節的數據項的個數
*stream:文件指針
注:這個函數以二進制形式對文件進行操作,不侷限於文本文件

  1. 在操作文件時,經常使用 feof 函數來判斷是否到達文件結尾。
    feof 函數的函數原型爲:
    int feof (FILE * fp);函數功能:
    檢查 fp 所關聯文件流中的結束標誌是否被置位,如果該文件的結束標誌已被置位,返回非 0 值;否則,返回 0
  2. 數據塊讀取(輸入)函數 fread 的函數原型爲:
    unsigned fread (void buf, unsigned size, unsigned count, FILE fp)
    函數功能:從 fp 指向的文件中讀取 count 個數據塊,每個數據塊的大小爲 size。把讀取到的數據塊存放到 buf 指針指向的內存空間中。
    返回值:返回實際讀取的數據塊(非字節)個數,如果該值比 count 小,則說明已讀到文件尾或有錯誤產生。這時一般採用函數 feof 及 ferror 來輔助判斷
  3. 函數 fseek 的函數原型爲:
    int fseek(FI:LE *fp, long offset, int origin);
    函數功能:把文件讀寫指針調整到從 origin 基點開始偏移 offset 處,即把文件讀寫指針移動到 origin+offset 處

隨機讀寫數據文件

rewind 函數說明:
作用:將文件內部的位置指針重新指向一個流(數據流/文件)的開頭
格式:void rewind(FILE *stream);
返回值:無
參數說明:
*stream:文件指針

ftell 函數說明:
作用:得到文件位置指針當前位置相對於文件首的偏移字節數(測定文件位置標記的當前位置)
格式:long ftell(FILE *stream);
返回值:成功返回當前文件位置,失敗返回-1L
參數說明:
*stream:文件指針
注:因爲ftell返回long型,根據long型的取值範圍-231~231-1(-2147483648~2147483647),故對大於2.1G的文件進行操作時出錯。

fseek 函數說明:
作用:重定位流(數據流/文件)上的文件內部位置指針
格式:int fseek(FILE *stream, long offset, int origin);
返回值:成功返回0,失敗返回非0值
參數說明:
*stream:文件指針
offset:偏移量,正數表示正向偏移,負數表示負向偏移。因爲是long型數據,所以應在數字後面加一個字母L
origin:設定從文件的哪裏開始偏移,可取值爲:SEEK_CUR、 SEEK_END 或 SEEK_SET,詳見下表:

文件讀寫的出錯檢測

ferror 函數說明:
作用:在調用各種輸入輸出函數(如 putc、getc、fread、fwrite等)時,如果出現錯誤,除了函數返回值有所反映外,還可以用ferror函數檢查
格式:int ferror(FILE *stream);
返回值:返回0表示未出錯,返回非0值表示出錯
參數說明:
*stream:文件指針

clearerr 函數說明:
作用:使文件錯誤標誌和文件結束標誌置爲0。假設在調用一個輸入輸出函數時出現了錯誤,ferror函數值爲一個非零值。在調用clearerr(fp)後,ferror(fp)的值變爲0。只要出現錯誤標誌,就一直保留,直到對同一文件調用clearerr函數或rewind函數,或任何其他一個輸入輸出函數。
格式:void clearerr(FILE *stream);
返回值:無
參數說明:
*stream:文件指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章