2011-05-17 22 views
1

當我嘗試使用函數feof(FILE *)確定文件結尾時,我發現它並不像我期望的那樣工作:即使流結束,也需要額外讀取。例如feof(FILE*)在讀出10個字節之後,如果在具有10個字節的數據的文件上被調用則不會說真。我需要額外的讀取操作,當然返回0,然後feof(FILE *)會說「好的,現在你到達最後。」當確定流結束時EOF出現問題

我的問題是爲什麼還需要一個read以及如何確定文件末尾或如何知道在文件流中留下多少字節(如果我不想使用feof型)?

感謝和最好的問候。

+0

http://c-faq.com/stdio/feof.html – Mat 2011-05-17 11:07:25

+0

[在C中是「while(!feof(...))」總是錯誤?](http:// stackoverflow。 com/questions/5431941/in-c-is-while-feof-always-wrong) – 2011-05-17 11:58:03

+2

將流視爲水龍頭後面的水。當你想要一些*(char:'getchar()',一行:'fgets()',一堆數據:'fread()',...)*你打開水龍頭,得到你想要的東西,並關閉水龍頭。如果它有效,你不知道是否有更多的水;或者如果水龍頭接下來會破裂。如果失敗了,你可以確定**爲什麼失敗:因爲沒有足夠的水('feof'是真的);或者是因爲水龍頭壞了('ferror'是真的)。 – pmg 2011-05-17 12:03:20

回答

11

不要使用feof()或任何變體 - 它就這麼簡單。你希望它能以某種方式預測下一次讀取會失敗,但這不是它所做的 - 它會告訴你以前的讀取結果是什麼。讀取文件的正確方法是(僞代碼):

while(read(file, buffer)) { 
    do something with buffer 
} 

換句話說,您需要測試讀取操作的結果。 C流和C++ iostream都是如此。

+0

如果你真的需要向前看,用iostreams你可以使用'偷看'。 – 2011-05-17 11:15:07

+1

'feof'是有用的,但不是OP想要的。該用途是測試以查看讀取失敗是由於EOF還是讀取錯誤。 – 2011-05-17 12:43:31

相關問題