可能的重复:
为什么循环条件内的 iostream::eof 被认为是错误的? https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong
eof() 不好的做法? https://stackoverflow.com/questions/5837639/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
}
因为在您尝试读取文件之前,该文件尚未结束。
operator>>
返回对处于当前状态的流的引用after已尝试读取并且成功或失败,并且流的计算结果为true
如果成功或者false
如果失败了。测试eof()
首先意味着文件中可能没有有用的数据,但尚未达到 EOF,然后当您从中读取时,它已处于 EOF 并且读取失败。
另一个重要的细节是operator>>
对于流跳过所有leading空格,而不是尾随空格。这就是为什么文件不能在读取之前处于 EOF 且在读取之后处于 EOF。
此外,当文件中的下一个数据是无法读入整数的数据时(例如,下一个数据是x
),不仅仅是在 EOF 时,这一点非常重要。
Example:
考虑代码:
int x, y;
f >> x;
if (!f.eof())
f >> y;
假设f
是一个包含数据的文件123␣
(␣表示空格),第一次读取会成功,但之后文件中就没有更多的整数了,not在EOF。第二次读取将失败,文件将位于 EOF,但您不知道,因为您在尝试读取之前测试了 EOF。然后你的代码会继续导致未定义的行为,因为y
未初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)