判斷檔案結束有兩種方法 EOF和feof

2022-03-19 12:31:33 字數 789 閱讀 7296

判斷檔案結束有兩種方法:eof和feof()

檢視stdio.h可以看到如下定義:

由此可以看出,這兩種方式的原理是不同的。

有人說eof只能用於文字檔案,其實不然,還要看定義的變數的型別。下面這段程式對文字檔案和二進位制檔案都可以:

如果讀到了ff,由於c定義為int型,所以實際上c=0x000000ff,不等於eof(-1=0xffffffff),因此不會誤判為檔案結尾。

但是如果把c定義為char型別,就有可能產生混淆了。

因為文字檔案中儲存的是ascii碼,而ascii碼中ff代表空值(blank),一般不使用,所以如果讀檔案返回了ff,說明已經到了文字檔案的結尾。但是如果是二進位制檔案,其中可能會包含ff,因此不能把讀到eof作為檔案結束的條件,此時只能用feof()函式。

在vc裡,只有當檔案位置指標(fp->_ptr)到了檔案末尾,然後再發生讀/寫操作時,標誌位(fp->_flag)才會被置為含有_ioeof。然後再呼叫feof(),才會得到檔案結束的資訊。因此,如果執行如下程式:

會發現多輸出了乙個ffffffff,原因就是在讀完最後乙個字元後,fp->flag仍然沒有被置為_ioeof,因而feof()仍然沒

有探測到檔案結尾。直到再次呼叫fgetc()執行讀操作,feof()才能探測到檔案結尾。這樣就多輸出了乙個-1(即ffffffff)。

正確的寫法應該是:

這麼說其實feof()是可以用eof來代替的嘍?不是,這裡還有乙個問題。fgetc返回-1時,有兩種情況:讀到檔案結尾或是讀取錯誤。因此我們無法確信檔案已經結束, 因為可能是讀取錯誤! 這時我們需要feof()。

判斷檔案結束有兩種方法 EOF和feof

判斷檔案結束有兩種方法 eof和feof 檢視stdio.h可以看到如下定義 由此可以看出,這兩種方式的原理是不同的。有人說eof只能用於文字檔案,其實不然,還要看定義的變數的型別。下面這段程式對文字檔案和二進位制檔案都可以 如果讀到了ff,由於c定義為int型,所以實際上c 0x000000ff,...

判斷檔案結束有兩種方法 EOF和feof

判斷檔案結束有兩種方法 eof和feof 檢視stdio.h可以看到如下定義 cpp view plain copy print?define eof 1 define ioeof 0x0010 define feof stream stream flag ioeo 由此可以看出,這兩種方式的原理是...

判斷委託操作結束的兩種方法

眾所周知,委託的執行過程類似於執行緒的執行 實際上本質就是執行緒 當委託被 invoke 以後,程式會開啟乙個非同步執行緒執行委託,當委託執行完畢時執行緒自動終止。那麼當委託被呼叫以後,如何判斷委託是否已經執行完畢呢?本文給出兩種方式判斷委託是否執行完畢。1 根據返回值判斷。當程式呼叫 begini...