我有这个文本示例
Ahmed 10
kmal 5
doola 6
我正在使用此代码来阅读它
if (myfile.is_open())
{
while ( myfile.good() )
{
myfile >> name;
myfile >> phone;
cout << name <<" "<<phone<<endl;
}
myfile.close();
}
我得到了这个输出
Ahmed 10
kmal 5
doola 6
doola 6
为什么这段代码会两次读取最后一行?
答案 0 :(得分:6)
myfile.good()
变为false。与myfile.eof()
相同。
你想要的基本上是:
myfile >> name;
myfile >> phone;
if (!myfile.good()) break;
这可以缩短为:
if (!(myfile >> name >> phone)) break;
或最后:
while (myfile >> name >> phone) { ... }
答案 1 :(得分:2)
尝试
while( myfile >> name >> phone ) {
// your code here
}
我认为另一种方法的问题是,在你真正尝试阅读超过你应该阅读之前,不会发出信号。也就是说,当你在最后一轮尝试myfile >> name
时。这失败了,myfile >> phone
也是如此,只有这样才能摆脱循环。
答案 2 :(得分:1)
请勿使用while(myfile.good())
。它仍会显示true
,即使您已阅读文件中的最后一行。然后,下一个>>
将失败,使name
和phone
变量保持不变。请改用:while(myfile >> name >> phone) {...}
答案 3 :(得分:1)
iostream状态不具有预测性。它报告了结果 以前的操作,而不是下一个操作(这是不可能的 无论如何都要实施)。 和 myfile.good()甚至不是一个可靠的指标 上一次操作的结果:如果操作失败,则为 将是错误的,但如果操作成功,则不一定 真正。忘了那个功能。
使用流可以作为布尔值来测试成功的事实 以前的操作。一旦失败,你就可以使用eof(), 和坏()确定原因(但关于eof(),仅在之后 失败---即使之前的操作,eof()也可能返回true 成功)。因此:
while ( myfile >> name >> phone ) {
// ...
}
if ( myfile.bad() ) {
std::cerr << "Hardware read error" << std::endl;
} else if ( !myfile.eof() ) {
std::cerr << "Format error in file" << std::endl;
}