【问题标题】:Problem with EOF when determine stream end确定流结束时出现 EOF 问题
【发布时间】:2011-05-17 11:02:48
【问题描述】:

当我尝试使用函数feof(FILE *) 确定文件结尾时,我发现它没有按预期工作:即使流确实结束了,也需要额外读取。例如feof(FILE*) 如果在读取 10 个字节后对具有 10 个字节数据的文件调用,则不会判断为真。我需要一个额外的读取操作,它当然返回 0,然后feof(FILE *) 会说“好的,现在你到了尽头。”

我的问题是,如果我不想要 feof 样式,为什么还需要一个 read 以及如何确定文件结尾或如何知道文件流中剩余多少字节?

感谢和最好的问候。

【问题讨论】:

  • 把溪流想象成水龙头后面的水。当你想要一些东西时(一个字符:getchar(),一行:fgets(),一堆数据:fread(),...)你打开水龙头,得到你想要的,然后关闭水龙头。如果它起作用了,您将无法知道是否还有更多的水;或者如果水龙头接下来会断开。如果失败,您可以确定为什么失败:因为没有足够的水(feof 为真);或者因为水龙头坏了(ferror 是真的)。​​

标签: c++ c io eof


【解决方案1】:

不要使用 feof() 或任何变体——就这么简单。您希望它以某种方式预测下一次读取将失败,但这不是它所做的 - 它告诉您上一次读取的结果是什么。读取文件的正确方法是(伪代码):

while( read( file, buffer ) ) {
   do something with buffer
}

也就是说,你需要测试读操作的结果。这对于 C 流和 C++ iostream 都是如此。

【讨论】:

  • 如果你真的需要向前看,可以使用 iostreams 使用 peek
  • feof 很有用,但不是 OP 想要的。用于测试读取失败是由于 EOF 还是读取错误。
猜你喜欢
  • 2014-02-10
  • 2016-06-01
  • 1970-01-01
  • 2021-02-26
  • 2023-04-06
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多