簡體   English   中英

在Visual Studio中進行EOF之前的EOF

[英]EOF before EOF in Visual Studio

我在程序中(在Visual Studio 2005中)有以下代碼段:

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”模式下打開。

您不能在從FILE*獲得的文件描述符上可靠地使用_eof() ,因為FILE*流已緩沖。 這意味着fp已將fp->_file吸干,並將剩余字節存儲在其內部緩沖區中。 最終fp->_file在eof位置,而fp仍有字節供您讀取。 讀取操作之后使用feof()來確定您是否位於文件末尾,並且如果將在FILE*上運行的函數與在整數文件描述符上運行的函數混合使用,請務必小心。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM