feof和ferror函數,C語言feof和ferror函數詳解

2020-07-16 10:04:24
正如前面所講,fgetc(或者getc)函數返回 EOF 並不一定就表示檔案結束,讀取檔案出錯時也會返回 EOF。即 EOF 宏不但能夠表示讀到了檔案結尾這一狀態,而且還能表示 I/O 操作中的讀、寫錯誤以及其他一些關聯操作的錯誤狀態。很顯然,僅憑返回 EOF(-1) 就認為檔案結束顯然是不正確的。

也正因為如此,我們需要使用 feof 函數來替換 EOF 宏檢測檔案是否結束。當然,在用 feof 函數檢測檔案是否結束的同時,也需要使用 ferror 函數來檢測檔案讀取操作是否出錯,當 ferror 函數返回為真時就表示有錯誤發生。在實際的程式中,應該每執行一次檔案操作,就用 ferror 函數檢測是否出錯。

其中,檔案結束檢測函數 feof 的一般原型如下:

int feof(FILE *fp);

值得注意的是,函數 feof 只用於檢測流檔案,當檔案內部位置指標指向檔案結束時,並未立即置位 FILE 結構中的檔案結束標記,只有再執行一次讀檔案操作,才會置位結束標誌,此後呼叫 feof 才會返回為真。看下面的範例程式碼:
int main(void)
{
    FILE *fp=NULL;
    char c;
    fp=fopen("myfile.txt","r");
    if(fp == NULL)
    {
        printf("不能夠存取該檔案.n");
        exit(1);
    }
    while(!feof(fp))
    {
        c = fgetc(fp);
        printf("%c:t%xn",c,c);
    }
    fclose(fp);
    fp=NULL;
}
這裡假設“myfile.txt”檔案中儲存的是“ABCDEF”,從表面上看,該範例程式碼的輸出結果應該是“ABCDEF”。但實際情況並非如此,你會發現最終輸出結果會多輸出一個結束字元EOF(這裡的 EOF 是 fgetc 函數的返回值,並不是檔案中存在的 EOF),執行結果如圖 1 所示。


圖 1 範例程式碼的執行結果(Microsoft Visual Studio 2010)