2

次のコードは、標準入力を標準出力にエコーするだけです。このようにプログラムを実行する./a.outと、何でも入力でき、プログラムは正常に動作します。ただし、このように実行すると./a.out < input.txt、の内容に関係なく、無限ループが発生しinput.txtます。

#include <iostream>

using namespace std;

int main() {
  string input;
  while (true) {
    cout << "Type your input: ";
    getline(cin, input);
    cout << input << endl;
  }
  return 0;
}

私は何が間違っているのですか?

編集:明確にするために、入力ファイルからの入力が終了した後、getlineはstdinからの追加の入力を待つことを期待しています。代わりに、何もないときに読み続けます。

4

3 に答える 3

1

ループには、中断であろうと、whileパーツのすぐ内側であろうと、終了条件はありません。代わりに、おそらくこれが必要です。

while (getline(cin, input))

これは、入力が失敗したときに終了します。おそらくEOFに達したことが原因です。

于 2012-10-14T02:51:16.633 に答える
1

ループの終了条件はありません。while (true)どのような場合でも無限ループです。つまり、ブレーク/終了などがありません。ループ本体で。

プログラムを使ってエコーするときは、stdinCtrl-Cを押して終了すると思います。を使用してプログラムを実行し./a.out、Ctrl-D(EOF)と入力します。無限ループも発生します。

ドキュメントを調べて、次のことを確認してくださいgetline。戻り値を使用してループを終了します。

while (getline(cin, input))
于 2012-10-14T02:51:46.370 に答える
0

あなたが間違っているのは、この場合、入力操作の結果を無視getlineすることです。

入力操作の結果を決して無視してはなりません。そうすることは常にプログラミングエラーです。外部データの状態を知ることも推測することもできないため、入力操作が成功したかどうかを常に確認する必要があります。そうでない場合は、通常、読み取り用の入力変数にアクセスすることはエラーであるため、結果にアクセスする前に、毎回確認する必要があります。

この場合、std::getlineはストリームオブジェクトへの参照を返し、ストリームをブール値として評価できます。true抽出が成功した場合にのみ、評価されます。それ以外の場合は、結果を使用しないでください(おそらく読み取りを停止してください)。

全体として、コードは次のようになります。

for (std::string line; std::getline(std::cin, line); )
{
    // use "line"
}
于 2012-10-14T02:59:18.967 に答える