9

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;
}
4

1 に答える 1

17

コードはこちら

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

実際には failbit をクリアしません。ストリームの現在の状態をに置き換えfailbitます。

すべてのビットをクリアするには、単に を呼び出しますclear()


標準の説明は少し複雑で、他の関数の結果として述べられています

void clear(iostate state = goodbit);

事後条件:もしそうでなければそうでなけれrdbuf()!=0ば。state == rdstate();rdstate()==(state | ios_base::badbit)

これは基本的に、次の の呼び出しが にrdstate()渡された値を返すことを意味しclear()ます。他の問題がある場合を除いて、その場合もbadbit同様に発生する可能性があります。

また、goodbit実際にはまったくビットではありませんが、他のすべてのビットをクリアするために値がゼロになっています。

特定の 1 ビットだけをクリアするには、この呼び出しを使用できます

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

ただし、1 つのフラグをクリアして他のフラグが残っている場合、ストリームから読み取ることはできません。したがって、この使用はかなり制限されています。

于 2012-06-28T15:05:44.927 に答える