【问题标题】:Why is (foobar>>x) preferred over (! foobar.eof() ) [duplicate]为什么 (foobar>>x) 优先于 (! foobar.eof() ) [重复]
【发布时间】:2012-12-29 03:23:52
【问题描述】:

可能重复:
Why is iostream::eof inside a loop condition considered wrong?
eof() bad practice?

我的老师说我们不应该使用 EOF 来读取文本文件或二进制文件信息,而应该使用 (afile>>x)。他没有解释原因,谁能给我解释一下。谁能解释一下这两种不同的阅读方式有什么区别

//Assuming declaration 
//ifstream foobar



( ! foobar.eof() )
{
    foobar>>x; // This is discouraged by my teacher

}


 while (foobar>>x)
{
  //This is encouraged by my teacher

}

【问题讨论】:

  • this 和许多其他人。

标签: c++ text-files binaryfiles


【解决方案1】:

因为在您尝试读取文件之前,该文件并未位于末尾。

operator>> 返回对流的引用,该引用处于之后已尝试读取并且成功或失败的状态,如果成功,则流计算为true 或@987654323 @如果失败。对eof() 的测试首先意味着文件中可能没有有用的数据,但尚未处于EOF,然后当您从中读取时,它处于EOF 并且读取失败。

另一个重要的细节是operator>> 用于流跳过所有前导空格,而不是尾随空格。这就是为什么文件不能在读取之前处于 EOF 并且在读取之后处于 EOF 的原因。

另外,前者在文件中的下一个数据是无法读入整数的数据时起作用(例如,下一个数据是x),而不仅仅是在EOF时,这一点非常重要。

示例:

考虑代码:

int x, y;

f >> x;

if (!f.eof())
    f >> y;

假设f 是一个包含数据123␣ 的文件(␣ 表示空格),第一次读取会成功,但之后文件中没有更多的整数并且它是不是 在 EOF。第二次读取将失败,文件将位于 EOF,但您不知道,因为您在尝试读取之前测试了 EOF。然后您的代码继续导致未定义的行为,因为 y 未初始化。

【讨论】:

  • @Computernerd 看我的例子。
  • 我喜欢你的解释。直截了当,易于理解。
  • @SethCarnegie 不会因为 ( f>>y ) 也导致失败,因为它无法读取空间?
  • @Computernerd 就像我说的,operator>> 返回一个ostream&,其计算结果为bool。如果读取失败,它将评估为false,如果读取成功,它将评估为true
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2014-01-12
相关资源
最近更新 更多