2011-09-02 33 views
0

我曾在一個節目這個片段中(在Visual Studio 2005):EOF在Visual Studio

if(_eof(fp->_file)) 
{ 
    break; 
} 

它打破了封閉循環EOF達到時。但該程序無法解析文件中的最後幾千個字符。因此,爲了找出發生了什麼事,我這樣做:

if(_eof(fp->_file)) 
{ 
    cout<<ftell(fp)<<endl; 
    break; 
} 

現在,我從FTELL得到的答案比實際的文件大小(不預期)的不同(小)。我認爲Windows可能會有些問題的文件,那麼我這樣做:

if(_eof(fp->_file)) 
{ 
    cout<<ftell(fp)<<endl; 
    fseek(fp, 0 , SEEK_END); 
    cout<<ftell(fp)<<endl; 
    break; 
} 

好了,FSEEK()給出正確的答案(等於文件大小)和初始FTELL()失敗(如前所述)。

有什麼想法可能是錯誤的地方?

編輯:該文件以「rb」模式打開。

+0

這是一個二進制文件或文本文件?你是否以正確的模式(二進制或文本)打開它? – Feanor

+0

它以二進制模式打開... – c0da

+0

用你最喜歡的十六進制編輯器打開文件,轉到那個字節,看看有什麼。然後你會得到你的答案。 –

回答

3

由於FILE*流被緩衝,所以對於從FILE*獲取的文件描述符,您無法可靠地使用_eof()。這意味着fp吸乾fp->_file dry並將剩餘的字節存儲在其內部緩衝區中。最終fp->_file處於eof位置,而fp仍然有字節供您閱讀。在之後使用feof()執行讀取操作以確定您是否在文件末尾,如果將在FILE*上運行的函數與在整數文件描述符上運行的函數混合,請小心。

+0

太棒了!它工作得很好......非常感謝...... :) – c0da

1

如果您的文件I/O操作位於包裝它的FILE流上,則不應在描述符上直接使用_eof()。在您的應用程序從FILE流中讀取所有數據之前,會發生緩衝並且底層描述符將達到文件結尾。

在這種情況下,ftell(fp)報告流的狀態,您應該使用feof(fp)將它們保留在同一個I/O域中。