1. 程式人生 > >feof()原理和用法

feof()原理和用法


一、feof()是什麼?

feof()是檢測流上的檔案結束符的函式,如果檔案結束,則返回非0值,否則返回0

一般在檔案操作,中經常使用feof()判斷檔案是否結束。


二、feof()的經典錯誤

根據這個函式的定義,一般大家都是這樣使用的,但是這樣使用,檔案中無論是否有內容,都會被判斷為“檔案不為空”。

#include<stdio.h>
int main(void)
{
    FILE *p;
    p = fopen("open.txt", "r");
    if (feof(p))
    {
        printf
("檔案為空。"); } else { printf("檔案不為空。"); } return 0; }

三、feof()的原理

1.EOF

EOF是一個計算機術語,為End Of File的縮寫,在作業系統中表示資料源無更多的資料可讀取。資料源通常稱為檔案或串流。通常在文字的最後存在此字元表示資料結束。

這個定義的意思是,文件的結尾都有一個隱藏字元”EOF”,當程式讀取它的時候,就會知道檔案已經到達結尾。通常使用while迴圈加EOF判斷作為讀取結束的標誌。

EOF 的值通常為 -1,但它依系統有所不同。

2.feof()

  • feof()的原理:
    • feof()函式,並不是通過讀取到檔案的EOF來評判,這個檔案是否為空。
    • 對feof()來說,它的工作原理是,站在游標所在位置,向後看看還有沒有字元。如果有,返回0;如果沒有,返回非0。它並不會讀取相關資訊,只是檢視游標後是否還有內容。
  • 直接使用時的錯誤分析:
    • 對於一個空檔案來說,當程式開啟它的時候,它的游標會停在檔案的開頭,但是由於檔案裡什麼內容都沒有存(但是EOF是存在的),即整個檔案就存貯了一個EOF。當程式開啟檔案,並直接呼叫feof()時,這個函式就會站在游標的位置向後張望,結果就看見了EOF,然後就當然返回0了。

四、如何正確使用

既然我們明白了原理,那麼如何正確的使用它呢?

#include<stdio.h>
int main(void)
{
    FILE *p;
    p = fopen("open.txt", "r");
    getc(p);
    if (feof(p))
    {
        printf("檔案為空。");
    }
    else
    {
        rewind(p);//將游標跳回到檔案開頭
        int a;
        fscanf(p,"%d",&a);
        printf("%d", a);
    }
    return 0;
 }

分析:

  • 對於檔案來說,無論是空檔案,還是存有資訊的檔案,當檔案被開啟,游標處於預設的開頭時,游標後都有資訊,這時候呼叫feof()來檢視游標後是否還有內容,就沒意義。
  • 所以我們需要從相同中找不同,先使用getc(),從檔案中讀取一個字元,讓游標向後移動一個字元。這時空檔案的游標就已經移動到EOF的後面,這時使用feof()就會返回1了。這才是feof()的正確用法。
  • 但是要注意,一定要將游標回到檔案的開頭,因為之前判斷檔案是否為空時,將游標向前移動了一位,必須要將游標恢復到開頭,這樣才能保證檔案的正常讀取。