讀取磁碟檔案

到目前為止,我們的輸入與輸出, 都只有利用 UNIX 作業系統所提供的標準輸入或輸出裝置 (stdin and stdout)。 這一節我們要學習開、關磁碟檔案的最基本步驟。 磁碟檔案的處理,難免牽涉到作業系統,所以在各種作業系統中也許會稍有出入。 但是最基本的步驟應該都相同:

  1. 宣告一個屬於檔案指標的變數,例如
    FILE *fp;
    注意 FILE 一定要大寫。 FILE 看起來好像是一個資料型態的樣子,其實不是。 我們現在不便解釋,讀者先照著做就是了。
  2. 呼叫 fopen() 打開一個檔案,它會返回一個檔案指標。 將返回的指標以 fp 儲存。例如
    fp = fopen("a.c", "r");
    其中 a.c 代表要打開的檔案名,r 代表要讀這個檔案的內容。 注意,這兩個字都必須放在一對雙引號裡面。 如果檔案不存在,或是您的程式打不開 (例如您的帳號沒有讀取的權力), 則 fopen() 會返回 NULL 指標。 NULL 就像 EOF 一樣,是個 C 語言自己知道的符號參數。
  3. 然後就可以利用 C 語言提供的內建函式,從檔案中讀取資料。稍後再談。 從此以後,C 程式中一律以 fp 來讀取檔案,不會再用到真正的檔案名。
  4. 在檔案用完之後,應該呼叫
    fclose(fp);
    把檔案關上。雖然程式正常結束之後,檔案會自動被關閉。 但是最好養成一個愛整潔的好習慣,記得自己把檔案關閉。
  5. 同一個磁碟檔案,可以在同一個程式中被開、關任意多次。
  6. 如果在一個程式中要同時開 N 個檔案,則需要 N 個檔案指標的變數。
  7. 如果在一個程式中要開 N 個檔案,但是一次只開一個, 而且在關閉了前一個檔案之後才打開下一個,則只需要宣告一個檔案指標變數, 讓它重複使用即可。

從檔案讀資料的最基本函式就是 getc()。 它的用處和 getchar() 幾乎完全一樣, 只是現在要指定一個檔案指標的變數,從指定檔案中依序讀取一個字元。 以下是一個簡單的測試程式,讀者應該自己改變符號參數 FILENAME。 這個程式嘗試打開一個名叫 FILENAME 的檔案, 如果成功了,就把它的內容寫在標準輸出裝置上。


#include <stdio.h>
 
/* 測試 fopen(), getc() and fclose()  (test-getc.c) */
#define FILENAME "a.c"

main() {
    FILE *fp;
    int c;
    if ((fp = fopen(FILENAME, "r")) == NULL)
        printf("File is not readable.\n");
    else {
        while((c = getc(fp)) != EOF)
            putchar(c);
    }
    fclose(fp);
}

檔案名可以包含路徑名。例如讀者可以嘗試
#define FILENAME "../an_existent_file_name"
或者
#define FILENAME "/etc/passwd"
它的執行結果就好像 cat FILENAME 一樣。

習題

  1. 探究 NULL 的數值究竟是什麼?

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Feb 28, 2001
Last Revised: Feb 28, 2001
© Copyright 2001 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw