重置流的状态

时间:2012-06-28 14:33:28

标签: c++ state iostream conditional-statements

我有一个问题与stackoverflow std::cin.clear() fails to restore input stream in a good state上的这个问题有点类似,但是那里提供的答案对我不起作用。

问题是:如何将流的状态重新设置为'good'?

这是我的代码如何尝试,但状态永远不会再次变好。我分别忽略了这两行。

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

1 个答案:

答案 0 :(得分:13)

这里的代码

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实际上根本不是一点,但是值为零以清除所有其他位。

要清除只是一个特定位,您可以使用此调用

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

但是,如果清除一个标记而其他标记仍然存在,则仍然无法从流中读取。所以这种用途相当有限。