可能重复:
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.
}
发布于 2010-12-01 21:09:12
你很少想要检查不好的、不好的和好的。特别是对于eof (因为!stream.eof()是一个常见的错误),当前在EOF处的流并不一定意味着最后一次输入操作失败;相反,不在EOF处并不意味着最后一次输入成功。
所有的流状态函数- fail、bad、eof和good -都会告诉您流的当前状态,而不是预测未来操作的成功。在执行完期望的操作后,检查流本身(相当于反向的失败检查):
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()的名称有误,并且不等同于测试流本身(上面的示例就是这么做的)。
发布于 2010-12-01 20:45:48
只需使用
ifstream f("x.txt");
while (getline(f, line)) {
// whatever
}
这是编写这样一个循环的惯用方法。我不能(在Linux机器上)重现这个错误。
发布于 2010-12-01 20:48:45
它没有读取最后一行两次,但因为它在到达eof时读取失败,所以您的字符串行具有先前的值。
这是因为当f读取EOF时,它不再是“好的”,而不是当它将要读取EOF时。
https://stackoverflow.com/questions/4324441
复制相似问题