在Visual Studio中EOF之前的EOF

EOF before EOF in Visual Studio

本文关键字:EOF Visual Studio      更新时间:2023-10-16

我在一个程序中(在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仍然有字节供您读取。在 read操作之后使用feof() 来确定是否处于文件的末尾,如果将操作FILE*的函数与操作整型文件描述符的函数混合使用,请小心。

如果文件I/O操作在包装它的file流上,则不应该直接在描述符上使用_eof()。在应用程序从FILE流中读取所有数据之前,发生了缓冲,底层描述符将到达文件结束。

在本例中,ftell(fp)报告流的状态,您应该使用ftell(fp)将它们保持在相同的I/O域中。