3

コマンドの実行:

./program < input.txt

次のコードチェックを使用します。

string input;
while(cin) {
  getline(cin, input);
}

上記のコードはgetline()、入力が空の場合に追加の呼び出しを生成するようです。\nこれは、input.txtの最後の行にが存在するかどうかに関係なく発生します。

4

3 に答える 3

7

@Jacobには正しい解決策がありましたが、何らかの理由で彼の答えを削除しました。ループで何が起こっているかは次のとおりです。

  1. cin障害ビット (BADBIT、FAILBIT) がないかチェックされます。
  2. cinファイルからまだ何も読み取られていないため、問題は報告されていません。
  3. getlineが呼び出され、ファイルの終わりを検出し、EOF ビットと FAILBIT を設定します。
  4. ループは 1 から再度実行されますが、今回は終了します。

代わりに、次のようにする必要があります。

std::string input;
while(std::getline(std::cin, input))
{
     //Have your way with the input.
}
于 2010-11-28T05:46:39.663 に答える
3

これはどう:

string input;
while(getline(cin, input)) {
  //do something with input...
}
于 2010-11-28T05:27:41.047 に答える
2

編集:以下の例では、「EOFを検出する方法」を示していることに注意してください。@Billyが指摘しているように、エラー状態eofを検出するgood()代わりに使用することをお勧めします。回答の最後にこれに関する情報を含めましたが、それは重要なので、明確にするためにこのメモを上部に追加します。eof()

(元の答えは次のとおりです)


あなたはこれを求めている:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}

operator!onのみを使用するとiostream、障害またはその他のエラー状態が発生したかどうかがチェックされます。 ios :: operator!()

good()の代わりにを使用して、、、、またはのいずれかの条件を!eof()チェックできます。 ios :: good()eofbadbitfailbit

于 2010-11-28T05:35:12.620 に答える