2017-03-26 20 views
0

文字または文字列を入力するときに、次のコードが無限ループになるのはなぜですか?私はそれについての質問を見てきましたし、解答で提供された解決策(例here)ですが、それはまったく役に立たないようです。このコードはそこに提案されているソリューションを実装していますが、それでも無限ループが発生します。std :: cinが無限ループになる

#include <iostream> 
#include <bitset> 
#include <limits> 
using namespace std; 

int main() { 
    int n; 
    while (!(cin >> n)) { 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cin.clear(); 
    cout << std::bitset<8>(cin.rdstate()) << endl; 
    cin >> n; 
    cout << std::bitset<8>(cin.rdstate()) << endl; 
    } 
    cout << n; 
    return 0; 
} 

g++ --version folowingをyelds:g++ (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005

次のようにプログラムの出力は次のとおりです。

00000000 
00000100 
00000000 
00000100 
... and so on 

値はストリームがクリアされたという事実にもかかわらず、再入力beeingているように思えすべての入力は無視されています。

+0

これは、このI/Oコードの*本当に変わった変種であり、私は混乱したものをたくさん見ました。実際に何をしようとしていますか? –

+0

私はちょうどうまく動作するはずですが、正しい入力が与えられたときにループを終了しなければなりません。それが得られるまで。しかし、それは前のものがまだ提供されているかのように、別の入力を求めることはありません。基本的に質問には出発点ではなく、デバッグの試みが含まれています。 –

+0

さて、あなたは混乱を無視してクリアしましたが、これはまだ変わったコードです。 –

答えて

1

clearの前にignoreを呼び出してください。ただし、ignoreはストリームにエラーがないのに、その時点では常に有効です。
両方のステートメントを切り替えると正常に動作します:1つまたは複数の無効な入力の後、プログラムを正常に終了するには2つの連続した有効な入力が必要です。