[英]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.