首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试stream.good()或!stream.eof()读取最后一行两次

测试stream.good()或!stream.eof()读取最后一行两次
EN

Stack Overflow用户
提问于 2010-12-01 20:41:26
回答 3查看 30K关注 0票数 17

可能重复:

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.
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()的名称有误,并且不等同于测试流本身(上面的示例就是这么做的)。

票数 33
EN

Stack Overflow用户

发布于 2010-12-01 20:45:48

只需使用

ifstream f("x.txt");
while (getline(f, line)) {
    // whatever
}

这是编写这样一个循环的惯用方法。我不能(在Linux机器上)重现这个错误。

票数 9
EN

Stack Overflow用户

发布于 2010-12-01 20:48:45

它没有读取最后一行两次,但因为它在到达eof时读取失败,所以您的字符串行具有先前的值。

这是因为当f读取EOF时,它不再是“好的”,而不是当它将要读取EOF时。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4324441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档