可能重复:
Why is iostream::eof inside a loop condition considered wrong?
所以我在很多需要文件输入的程序中一直使用eof()
函数,而我的教授说使用它很好,但SO上的一些人说我不应该使用它而不真正指定原因。所以我想知道,有充分的理由吗?
答案 0 :(得分:32)
您可以使用eof
来测试其报告的确切条件 - 无论您是否已尝试阅读过去的文件结尾。您无法使用它来测试是否有更多的输入要读取,或者读取是否成功,这是更常见的测试。
错:
while (!cin.eof()) {
cin >> foo;
}
正确:
if (!(cin >> foo)) {
if (cin.eof()) {
cout << "read failed due to EOF\n";
} else {
cout << "read failed due to something other than EOF\n";
}
}
答案 1 :(得分:12)
你不应该使用它,因为如果由于其他原因输入失败,你可能会被搞砸。
while(!file.eof()) {
int i;
file >> i;
doSomething(i);
}
如果文件内容为“WHAARRRRRRGARBL”,上述循环会发生什么?它无限循环,因为它不是文件的结尾,但你仍然无法从中提取int。
答案 2 :(得分:3)
你是如何使用它的? .eof()
将告诉您的是,流已经到达文件末尾,它已尝试读取不存在的数据。
这通常不是你想要的。通常,你想要知道你正在命中文件的末尾,或者你想要到达文件的末尾,而不是你已经命中了它。在像这样的循环中:
while(!f.eof())
{
f >> /* something */;
/* do stuff */
}
你将尝试读取输入和失败,然后你将执行/* do stuff */
中的所有内容,然后循环条件失败并且循环停止。
该循环的另一个问题是输入可能会失败的其他方式。如果文件中的错误条件不是EOF,.fail()
将返回true
,但.eof()
则不会。
答案 3 :(得分:3)
如果上述答案令人困惑:
人们认为它的作用是错误的:
它实际上做了什么:
如果eof()为真,那你就错了。因此解释了教授的说法。使用它意味着什么,发生了错误。