繁体   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