9

我有一个与stackoverflow std::cin.clear() failed 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为.

要清除所有位,只需调用clear().


标准中的描述有点复杂,是其他功能的结果

void clear(iostate state = goodbit);

后置条件:如果rdbuf()!=0state == rdstate();否则rdstate()==(state | ios_base::badbit)

这基本上意味着下一次调用rdstate()将返回传递给clear(). 除非有其他问题,在这种情况下,您也可能会遇到问题badbit

此外,goodbit实际上根本不是一点点,而是具有零值以清除所有其他位。

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

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

但是,如果您清除一个标志而保留其他标志,您仍然无法从流中读取。所以这种用途是相当有限的。

于 2012-06-28T15:05:44.927 回答