【问题标题】:Output to console overlaps [duplicate]输出到控制台重叠[重复]
【发布时间】:2012-09-28 09:42:33
【问题描述】:

可能重复:
Reading from text file until EOF repeats last line

我的 c++ 程序的 cout 输出打印到控制台但重叠。

例如:

while(pFile.good()){

  getline (pFile, pLine);
  cout<<pLine; 
}

此代码打印最后一行,以及上一行的一些剩余部分。

我在 cygwin 上使用 vi。这件事突然发生了。我是否更改了某些设置?

【问题讨论】:

  • 你应该总是更喜欢while (getline(...))而不是while (good()) getline(...)
  • 感谢您的提示!但是,控制台输出呢?有什么事吗?

标签: c++ cygwin vi


【解决方案1】:

getline() 丢弃它遇到的任何换行符。为了防止您的代码将所有行合并为一个大行,您需要改为:

cout << pLine << endl;

正如克里斯指出的那样,您还应该使用getline() 作为您的while 条件。否则,流现在可能被认为是“好的”,但是当您调用 getline() 时会达到 EOF。所以试试这个循环:

while (getline(pFile, pLine)) {
    cout << pLine << endl;
}

【讨论】:

  • 我仍然无法理解,如果getline() 一直如此,为什么会发生这种变化。
  • 这可能与一些环境因素有关......也许数据中使用的换行符发生了变化,或者类似的事情。
  • @esgee:发生这种情况是因为最后一次成功调用 getline() 读取到但未超过文件末尾;因此EOF 位未设置。设置 EOF 位的调用不会读取任何内容,只是将标记移到“文件结尾”之外。
【解决方案2】:

最后一行被打印两次的原因是因为您最后一次调用 getline() 失败,但您仍然打印了 pLine(即使其内容未定义)。

while(pFile.good()){

  getline (pFile, pLine);  // What happens if this line fails.
                           // Like when you read **past** the end of file.
  cout<<pLine; 
}

您的代码的正确版本是:

while(pFile.good()){

  if (getline (pFile, pLine))
  {    cout<<pLine;
  } 
}

但这通常写成:

while(getline (pFile, pLine))
{
   // The loop is only entered if the read worked.
   cout<<pLine; 
}

请记住,最后一次成功调用 getline() 时读取的是 up-to,但不会超过行尾。这意味着对 getline() 的下一次调用将失败并设置 EOF 位。

还请注意,您的输出会相互刺痛,因为您没有在行之间添加 '\n' 分隔符。注意:getline() 读取到下一个 '\n' 字符,但此终止字符不会添加到字符串 pLine

【讨论】:

    【解决方案3】:

    在这里你写在同一行,因为 getline 只是丢弃换行符,这就是为什么你必须写 &lt;&lt;endl

     while(pFile.good()){
    
          getline (pFile, pLine);
          cout<<pLine<<endl; 
        }
    

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 2013-04-09
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多