0

可能重复:
从文本文件中读取直到 EOF 重复最后一行

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

例如:

while(pFile.good()){

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

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

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

4

3 回答 3

1

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

cout << pLine << endl;

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

while (getline(pFile, pLine)) {
    cout << pLine << endl;
}
于 2012-10-08T06:55:12.000 回答
0

在这里你写在同一行,因为 getline 只是丢弃换行符,这就是你必须写的原因<<endl

 while(pFile.good()){

      getline (pFile, pLine);
      cout<<pLine<<endl; 
    }
于 2012-10-08T06:55:28.917 回答
0

最后一行打印两次的原因是因为您上次调用 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() 的最后一次成功调用读取但不超过行尾。这意味着对 getline() 的下一次调用将失败并设置 EOF 位。

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

于 2012-10-08T08:07:12.500 回答