0

重複の可能性:
EOFが最後の行を繰り返すまでテキストファイルから読み取る

私の c++ プログラムからの cout 出力は、コンソールに出力されますが、オーバーラップします。

例えば:

while(pFile.good()){

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

このコードは、最後の行と前の行の残りを出力します。

私はcygwinでviを使用しています。これは突然起こりました。設定を変更しましたか?

4

3 に答える 3

1

getline()遭遇した改行文字をすべて破棄します。コードがすべての行を1つの大きな行にマージしないようにするには、代わりに次のようにする必要があります。

cout << pLine << endl;

クリスが指摘したように、あなたもgetline()あなたのwhile条件として使うべきです。それ以外の場合、ストリームは「良好」と見なされる可能性がありますが、を呼び出すとEOFに到達しますgetline()。したがって、このループを試してください。

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

getlineは単に改行文字を破棄するため、ここでは同じ行で書き込みを行っています。そのため、uは書き込みを行う必要があります。<<endl

 while(pFile.good()){

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

最後の行が 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() の呼び出しは、行末までは読み取ります、行末を超えないことに注意してください。つまり、getline() の次の呼び出しは失敗し、EOF ビットが設定されます。

また、行間に '\n' 区切り文字を追加していないため、出力がぎくしゃくしていることにも注意してください。注: getline() は次の '\n' 文字まで読み取りますが、この終了文字は string に追加されませんpLine

于 2012-10-08T08:07:12.500 に答える