可能重复:
Why is iostream::eof inside a loop condition considered wrong?
我有以下代码:
ifstream f("x.txt");
string line;
while (f.good()) {
getline(f, line);
// Use line here.
}
但这会两次读到最后一行。为什么会发生这种情况?如何解决?
与以下内容非常相似:
ifstream f("x.txt");
string line;
while (!f.eof()) {
getline(f, line);
// Use line here.
}
答案 0 :(得分:31)
你非常非常想要检查坏,自己和好。特别是对于eof(as!stream.eof()是一个常见的错误),当前处于EOF的流并不一定意味着最后的输入操作失败;相反,不参加EOF并不意味着最后的投入是成功的。
所有流状态函数 - 失败,错误,失败和良好 - 告诉您流的当前状态,而不是预测未来操作的成功。在所需操作之后检查流本身(相当于反向失败检查):
if (getline(stream, line)) {
use(line);
}
else {
handle_error();
}
if (stream >> foo >> bar) {
use(foo, bar);
}
else {
handle_error();
}
if (!(stream >> foo)) { // operator! is overloaded for streams
throw SomeException();
}
use(foo);
阅读并处理所有行:
for (std::string line; getline(stream, line);) {
process(line);
}
指出,good()被错误命名,并不等同于测试流本身(上面的例子就是这样)。
答案 1 :(得分:9)
只需使用
ifstream f("x.txt");
while (getline(f, line)) {
// whatever
}
这是编写这样一个循环的惯用方法。我无法重现错误(在Linux机器上)。
答案 2 :(得分:2)
它没有读取最后一行两次,但因为它在达到eof时无法读取,所以你的字符串行具有之前的值。
这是因为f在读取EOF时不再“好”,而不是在读取它时。