コマンドの実行:
./program < input.txt
次のコードチェックを使用します。
string input;
while(cin) {
getline(cin, input);
}
上記のコードはgetline()
、入力が空の場合に追加の呼び出しを生成するようです。\n
これは、input.txtの最後の行にが存在するかどうかに関係なく発生します。
@Jacobには正しい解決策がありましたが、何らかの理由で彼の答えを削除しました。ループで何が起こっているかは次のとおりです。
cin
障害ビット (BADBIT、FAILBIT) がないかチェックされます。cin
ファイルからまだ何も読み取られていないため、問題は報告されていません。getline
が呼び出され、ファイルの終わりを検出し、EOF ビットと FAILBIT を設定します。代わりに、次のようにする必要があります。
std::string input;
while(std::getline(std::cin, input))
{
//Have your way with the input.
}
これはどう:
string input;
while(getline(cin, input)) {
//do something with input...
}
編集:以下の例では、「EOFを検出する方法」を示していることに注意してください。@Billyが指摘しているように、エラー状態やeofを検出するgood()
代わりに使用することをお勧めします。回答の最後にこれに関する情報を含めましたが、それは重要なので、明確にするためにこのメモを上部に追加します。eof()
(元の答えは次のとおりです)
あなたはこれを求めている:
string input;
while( !cin.eof() ) {
getline(cin, input);
}
operator!
onのみを使用するとiostream
、障害またはその他のエラー状態が発生したかどうかがチェックされます。 ios :: operator!()。
good()
の代わりにを使用して、、、、またはのいずれかの条件を!eof()
チェックできます。 ios :: good()。eof
badbit
failbit