1 打開文件 在對文件進行讀、寫操作之前,首先要解決的問題是如何把程式中要讀、寫的文件與磁碟上實際的數據文件聯繫起來。在 C 語言中這並不困難,只需調用 C 語言提供的庫函數 fopen “打開”文件就可實現這些聯繫。fopen 函數的一般調用形式為: fopen(文件名,文件使用方式); 函數返回 ...
1 打開文件
在對文件進行讀、寫操作之前,首先要解決的問題是如何把程式中要讀、寫的文件與磁碟上實際的數據文件聯繫起來。在 C 語言中這並不困難,只需調用 C 語言提供的庫函數 fopen “打開”文件就可實現這些聯繫。fopen 函數的一般調用形式為:
fopen(文件名,文件使用方式);
函數返回一個指向 FILE 類型的指針。例如:
FILE *fp;
fp = fopen("file_a", "r");
fopen 函數調用中有兩個字元串作為參數。第一個字元串中包含了進行讀、寫操作的文件名,用來指定所要打開的文件。本例中,指定的函數名為:file_a。第二個字元串中指定了文件的使用方式,用戶可通過這個參數來指定對文件的使用意圖。
若以上函數調用成功,函數返回一個 FILE 類型的指針,賦給文件指針變數 fp,從而把指針 fp與文件 file_a 聯繫起來。也就是說,在此調用後指針 fp 就指向了文件 file_a。當打開文件時出現了錯誤,fopen 函數將返回 NULL。為保證在程式中使用正確打開的文件,建議用以下程式段。當在打開文件發生錯誤時,使程式停止運行:
#include <stdlib.h>
...
if ((fp = fopen("file_a", "r")) == NULL)
{
printf("Cannot open this file !\n");
exit(0); //註意:使用 exit 函數時,必須包含 stdlib.h 頭文件
}
C 語言中,最常用的文件使用方式及其含義如下:
(1)“r”。為讀而打開文本文件。當指定這種方式時,對打開的文件只能進行“讀”操作。若指定的文件不存在,則會出錯;另外一些情況,如企圖去讀一個不允許讀的文件時,也會出錯。
(2)“rb”。為讀而打開一個二進位文件。其餘功能與 “r” 相同。
(3)“w”。為寫而打開文本文件。如果指定的文件不存在,系統將用在 fopen 調用中指定的文件名建立一個新文件;如果指定的文件已存在,則將從文件的起始位置開始寫,文件中原有的內容將全部消失。
(4)“wb”。為寫而打開一個二進位文件。可以在指定文件位置進行寫操作,其餘功能與 “w” 相似。
(5)“a”。為在文件後面添加數據而打開文本文件。如果指定的文件不存在,系統將用在 fopen 調用中指定的文件名建立一個新文件;如果指定的文件已存在,則文件中原有的內容將保存,新的數據寫在原有內容之後。
(6)“ab”。為在文件後面添加數據而打開一個二進位文件。其餘功能與 “a” 相同。
(7)“r+”。為讀和寫而打開文本文件。用這種方式時,指定的文件應當已經存在,既可以對該文件進行讀,也可以對該文件進行寫,在讀和寫操作之間不必關閉文件。只是對於文本文件來說,讀和寫總是從文件的起始位置開始。在寫新的數據時,只覆蓋新數據所占的空間,其後的老數據並不丟失。
(8)“rb+”。為讀和寫而打開一個二進位文件。功能與 “r+” 相同,只是在讀和寫時,可以由位置函數設置讀和寫的起始位置,也就是說不一定從文件的起始位置開始讀和寫。
(9)“w+”。首先建立一個新文件,進行寫操作,隨後可以從頭開始讀。如果指定的文件已存在,則原有的內容將全部消失。
(10)“wb+”。功能與 “w+” 相同,只是在隨後的讀和寫時,可以由位置函數設置讀和寫的起始位置。
(11)“a+”。功能與 “a” 相同,只是在文件尾部添加新的數據之後,可以從頭開始讀。
(12)“ab+”。功能與 “a+” 相同,只是在文件尾部添加新的數據之後,可以由位置函數設置開始讀的起始位置。
當運行一個 C 程式時,系統將負責自動打開三個文件,這三個文件分別是標準輸入文件、標準輸出文件和標準出錯文件,並規定相應的文件指針為 stdin、sdtout、stderr,它們已在 stdio.h 頭文件中進行了說明。通常情況下,stdin 與鍵盤連接、stdout 和 stderr 與終端屏幕連接。註意:這些指針是常量,不是變數,因此不能重新賦值。
2 關閉文件
當對文件的讀(寫)操作完成後,必須將它關閉。關閉文件可以調用庫函數 fclose 實現,fclose 函數的調用形式如下:
fclose(文件指針);
若 fp 是指向文件 file_a 的文件指針,當執行了 fclose(fp); 之後,若對文件 file_a 的操作方式為“讀”方式,則將使文件指針 fp 與文件 file_a 脫離聯繫。在此之後,可以重新分配文件指針 fp 去指向其他文件。若對文件 file_a 的操作方式為“寫”方式,則系統首先把該文件緩衝區中的剩餘數據全部輸出到文件中,然後使文件指針 fp 和文件 file_a 脫離聯繫。由此可見,完成對文件的操作後,應當關閉文件,否則文件緩衝區中的剩餘數據將丟失。
當成功執行了關閉操作,函數返回0,否則返回非0。