gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:08:12 26 4
gpt4 key购买 nike

Possible Duplicate:
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.
}

最佳答案

您非常非常少想检查 bad、eof 和 good。特别是对于 eof (因为 !stream.eof() 是一个常见错误),当前处于 EOF 的流并不一定意味着最后一个输入操作失败;反之,不在 EOF 并不意味着最后一次输入成功。

所有流状态函数——fail、bad、eof 和 good——告诉你流的当前状态,而不是预测 future 操作的成功。在所需操作之后检查流本身(相当于反向失败检查):

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() 命名错误,并不等同于测试流本身(上面的例子就是这样做的)。

关于c++ - 测试 stream.good() 或 !stream.eof() 读取最后一行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com