檔案處理

◎ 檔案概念:不論檔案類型(例如*.exe、*.doc、*.txt、*.cpp、...)為何,它們的儲存形式可以分為兩種,即文字檔(text file)二進位檔(binary file)文字檔是以ASCII碼儲存,每個字元皆佔有1個位元組,其內容可用文書編輯軟體(例如記事本)來查看或編輯;二進位檔則是將資料以二進位的格式儲存,例如影像檔或執行檔。一般文書處理軟體並不能處理二進位檔,如果以記事本開啟二進位檔,就只會出現一堆亂碼。

※ MS Word 雖然是文書編輯軟體,但其實所產生的 *.doc本質上仍是二進位檔,因為裡面含有許多特定格式。

◎ 檔案處理概念圖:

開啟檔案

fopen()

 

關閉檔案

fclose()

開啟檔案

fopen()

檔案處理

(讀取、寫入)

 

 

 

 

※ 檔案處理之前必須先開啟(可以一次開啟多個檔案),若檔案不再使用時應隨即關閉。

◎ 開啟檔案:須以FILE型態的檔案指標變數,透過fopen()函數進行開啟,其格式如下。
FILE  *fptr;    // fptr為暫訂之檔案指標變數,其名稱可以自行設定
fptr = fopen("欲開啟之檔名", "存取模式");
※ 「欲開啟之檔名」若包含路徑名稱,必須以雙反斜線(\\)代替原來的反斜線(\)。例如 "C:\\prog\\abc.txt"
※ 「欲開啟之檔名」亦可以使用字元陣列名稱,以便於在執行時輸入欲開啟之檔案名稱。
※ 「存取模式」包括三種:(1)開啟檔案供讀取:
"r"。(2)開啟檔案供(破壞性)寫入:"w"。(3)開啟檔案供新增:"a"
※ 函數fopen()定義於stdio.h中。若fopen()開啟檔案失敗,則會傳回NULL,因此
最好在檔案開啟時順便作檢視

◎ 關閉檔案:透過fclose()函數關閉即可,使用時將檔案指標傳入,例如fclose(fptr)。

◎ 檔案處理:基本上包括讀取寫入兩種動作,另外根據檔案是文字檔或二進位檔,其使用的函數也不同。如果是二進位檔,則讀取與寫入的函數是以「區塊」為單位,其函數為fread()fwrite()。如果是文字檔,則又依據所要讀取或寫入的是字元、字串、或者特定格式而有不同。下表列出一些檔案處理的常用函數。

檔案類型

函數功能

格式及說明

文字檔 讀取字元 int  getc (FILE  *fptr);

由fptr所指向的檔案讀取一個字元,傳回值為被讀取的字元。

寫入字元 int  putc (int ch, FILE  *fptr);

將字元ch寫入由fptr所指向的檔案。

讀取字串 char  *fgets(char  *str, int maxchar, FILE  *fptr);

從fptr所指向的檔案裡讀取最多maxchar個字元,然後將它寫入字元陣列str中。若讀取失敗或已讀到檔尾,則傳回NULL。

寫入字串 int  fputs(const char  *str, FILE  *fptr);

將字串str寫入fptr所指向的檔案。

讀取特定格式 fscanf(FILE  *fptr, ......);

除了多出fptr的部分外,其餘與scanf()相似。

依特定格式寫入 fprintf(FILE  *fptr, ......);

除了多出fptr的部分外,其餘與printf()相似。

檢查檔案是否結束 int  feof(FILE  *fptr);

檢查fptr所指向的檔案是否已讀取到檔案結束的位置。若尚未到達檔尾則傳回0,否則傳回非0的值。

二進位檔 區塊讀取 size_t  fread(void  *p, size_t  s, size_t  cnt, FILE  *fptr);

由檔案讀取cnt個資料項目,存放到指標p所指向的位址中,每一個資料項目大小為s個位元組,傳回值為讀取資料的個數。

區塊寫入 size_t  fwrite(const void  *p, size_t  s, size_t  cnt, FILE  *fptr);

由指標p所指向的位址開始,將cnt個大小為s個位元組的資料,寫入到fptr所指向的檔案,傳回值為成功寫入資料的個數。