我有一个问题与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;
}
答案 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);
但是,如果清除一个标记而其他标记仍然存在,则仍然无法从流中读取。所以这种用途相当有限。