【问题标题】:reading a line in text file twice两次读取文本文件中的一行
【发布时间】:2011-03-29 01:29:35
【问题描述】:

我有这个文本示例

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

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

【问题讨论】:

标签: c++


【解决方案1】:

myfile.good() 在读取失败后变为 false。与myfile.eof() 相同。

你想要的基本上是:

myfile >> name;
myfile >> phone;
if (!myfile.good()) break;

这可以缩短为:

if (!(myfile >> name >> phone)) break;

或者最后:

while (myfile >> name >> phone) { ... }

【讨论】:

    【解决方案2】:

    试试

    while( myfile >> name >> phone ) {
        // your code here
    }
    

    我相信另一种方法的问题在于,在您实际尝试阅读的内容超出应有的内容之前,不会发出 eof 信号。也就是说,当您在最后一轮尝试myfile &gt;&gt; name 时。这会失败,myfile &gt;&gt; phone 也会失败,然后你才能跳出循环。

    【讨论】:

      【解决方案3】:

      不要使用while(myfile.good())。即使您已阅读文件中的最后一行,它仍会显示true。然后下一个&gt;&gt; 将失败,而namephone 变量与上一个输入保持不变。改用这个:while(myfile &gt;&gt; name &gt;&gt; phone) {...}

      【讨论】:

      • @Ahmed:Ché,我忘了eof() 也存在同样的问题,抱歉。 :) 试试新版本。
      【解决方案4】:

      iostream 状态不可预测。它报告的结果 上一个操作,而不是下一个操作(这是不可能的 无论如何都要执行)。 而且 myfile.good() 甚至不是一个可靠的指标 上一次操作的结果:如果操作失败,则 将是假的,但如果操作成功,则不一定 真的。忘记那个函数。

      使用流可以作为布尔值来测试成功的事实 以前的操作。一旦失败,就可以使用 eof(), 和 bad() 来确定原因(但关于 eof(),只有在 failure---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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 2015-09-22
        • 1970-01-01
        • 2012-12-31
        • 2012-10-13
        • 2021-12-28
        • 2014-12-10
        • 2020-10-24
        相关资源
        最近更新 更多