在文本文件中读取一行两次

时间:2011-03-29 01:29:35

标签: c++

我有这个文本示例

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

为什么这段代码会两次读取最后一行?

4 个答案:

答案 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,即使您已阅读文件中的最后一行。然后,下一个>>将失败,使namephone变量保持不变。请改用: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;
}