【问题标题】:EOF before EOF in Visual StudioVisual Studio 中 EOF 之前的 EOF
【发布时间】:2011-09-02 18:46:36
【问题描述】:

我在一个程序中使用了这个 sn-p(在 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”模式打开。

【问题讨论】:

  • 这是二进制文件还是文本文件?您是否以正确的模式(二进制或文本)打开它?
  • 以二进制方式打开...
  • 在你最喜欢的十六进制编辑器中打开文件,转到那个字节,看看里面有什么。然后你就会得到答案。
  • @Tomalak 这件事发生位置的最后一个字节是8C,下一个字节是ED。这对你有什么启示?
  • 没关系;路德是正确的。

标签: c++ visual-studio file-io


【解决方案1】:

您不能对从FILE* 获得的文件描述符可靠地使用_eof(),因为FILE* 流被缓冲。这意味着fp 已经吸干了fp-&gt;_file 并将剩余的字节存储在其内部缓冲区中。最终 fp-&gt;_file 位于 eof 位置,而 fp 仍有字节供您读取。使用feof() 读取操作之后确定您是否在文件末尾,如果您将操作FILE* 的函数与操作整数文件描述符的函数混合使用,请小心。

【讨论】:

    【解决方案2】:

    如果您的文件 I/O 操作是在包装它的 FILE 流上进行的,则不应直接在描述符上使用 _eof()。在您的应用程序从 FILE 流中读取所有数据之前,会发生缓冲,并且底层描述符将到达文件末尾。

    在这种情况下,ftell(fp) 正在报告流的状态,您应该使用 feof(fp) 将它们保持在同一个 I/O 域中。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2015-04-22
      • 2020-08-22
      • 2016-02-18
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多