重複の可能性:
EOFが最後の行を繰り返すまでテキストファイルから読み取る
私の c++ プログラムからの cout 出力は、コンソールに出力されますが、オーバーラップします。
例えば:
while(pFile.good()){
getline (pFile, pLine);
cout<<pLine;
}
このコードは、最後の行と前の行の残りを出力します。
私はcygwinでviを使用しています。これは突然起こりました。設定を変更しましたか?
重複の可能性:
EOFが最後の行を繰り返すまでテキストファイルから読み取る
私の c++ プログラムからの cout 出力は、コンソールに出力されますが、オーバーラップします。
例えば:
while(pFile.good()){
getline (pFile, pLine);
cout<<pLine;
}
このコードは、最後の行と前の行の残りを出力します。
私はcygwinでviを使用しています。これは突然起こりました。設定を変更しましたか?
getline()
遭遇した改行文字をすべて破棄します。コードがすべての行を1つの大きな行にマージしないようにするには、代わりに次のようにする必要があります。
cout << pLine << endl;
クリスが指摘したように、あなたもgetline()
あなたのwhile
条件として使うべきです。それ以外の場合、ストリームは「良好」と見なされる可能性がありますが、を呼び出すとEOFに到達しますgetline()
。したがって、このループを試してください。
while (getline(pFile, pLine)) {
cout << pLine << endl;
}
getlineは単に改行文字を破棄するため、ここでは同じ行で書き込みを行っています。そのため、uは書き込みを行う必要があります。<<endl
while(pFile.good()){
getline (pFile, pLine);
cout<<pLine<<endl;
}
最後の行が 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
。