C ++ IO istreamオブジェクトを使用して読み取ると、無限ループが発生する

c++ io
C ++ IO istreamオブジェクトを使用して読み取ると、無限ループが発生する

以下の関数は、文字列が入力として入力された場合、無限ループになります

istream & inputFunc(istream &is)
{
   int ival;
    // read cin and test only for EOF; loop is executed even if there are other IO failures
    while (cin >> ival, !cin.eof()) {
        if (cin.bad())         // input stream is corrupted; bail out
            throw runtime_error("IO stream corrupted");
        if (cin.fail()) {                        // bad input
            cerr<< "bad data, try again";        // warn the user
            cin.clear(istream::failbit);         // reset the stream
            continue;                            // get next input
        }
        // ok to process ival
        cout << "you entered: " << ival << endl;
    }



}

以下の関数は、文字列が入力として入力された場合、無限ループになります

出力

再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、もう一度試すデータ、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、再び悪いデータを試す、

  2  0


ベストアンサー

あなたは2つのことをする必要があります:

1)次のような状態をクリアします: `cin.clear(istream

goodbit);`

2)状態をクリアした後、一度に1文字をスキップします。次の数字がどこから始まるかわからないためです。

 char c;
 cin >> c;

1


はい、無限ループします。 cin.clear()を見てください。

0


不正なデータはまだ入力ストリームに残っていますか? もしそうなら、このような何かが役立つかもしれません:

    if (cin.fail()) {                        // bad input
        string badData;                      // create a string to hold the bad input
        cin.clear(istream::failbit);         // reset the stream
        cin >> badData;                      // read the bad input to clear the stream
        cerr<< "bad data: " << badData << ", try again"; // warn the user
        continue;                            // get next input
    }

0


タイトルとURLをコピーしました