2012-06-28 10 views
6

私はこの質問と少し類似している質問をstackoverflow std::cin.clear() fails to restore input stream in a good stateで持っていますが、ここで提供されている回答は私のためには機能しません。ストリームの状態をリセットする

問題は次のとおりです。もう一度ストリームの状態を「良い」状態にリセットするにはどうすればよいですか?

ここで私はそれを試してみますが、状態は決して良い状態に戻っていません。私は両方の行を別々に無視して使用しました。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

答えて

11

ここ

std::cin.clear(std::istream::failbit); 

実際failbitをクリアしていないコードは、それfailbitストリームの現在の状態を置き換えます。

すべてのビットをクリアするには、clear()に電話してください。


標準の記述は少し入り組んであり、他の関数の結果

void clear(iostate state = goodbit);

事後条件として次のように述べている。さもなければrdstate()==(state | ios_base::badbit)state == rdstate();次いでrdbuf()!=0場合。基本的にrdstate()への次の呼び出しがclear()に渡された値を返すことを意味し

。他の問題がある場合を除いて、badbitが得られるかもしれません。

また、goodbitは実際にはビットではありませんが、他のすべてのビットをクリアするために値0があります。あなたは明確な1つのフラグなどが残っている場合

だけ一つの特定のビットをクリアするには、あなたはまだ、ストリームから読み取ることができません。しかし、この呼び出し

cin.clear(cin.rdstate() & ~ios::failbit); 

を使用することができます。したがって、この使用はかなり制限されています。

+0

私の本で言う:clear(flag)は、指定された条件ステートを有効に設定します。私はこれを次のように解釈しました:指定されたエラービットをクリアします。これは間違っていますか? – physicalattraction

+0

* all *フラグをクリアするのは 'clear()'です。単一のフラグをクリアするにはもう少し複雑です(あまり役に立ちません)。私は私の答えに新しい部分を加えました。 –

関連する問題