檔案處理
◎ 檔案概念:不論檔案類型(例如*.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所指向的檔案,傳回值為成功寫入資料的個數。 |