我有一个问题与 stackoverflow 上的这个问题有点相似std::cin.clear() 无法将输入流恢复到良好状态 https://stackoverflow.com/questions/4960399/stdcin-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;
}
代码在这里
std::cin.clear(std::istream::failbit);
实际上并没有清除故障位,它replaces流的当前状态failbit
.
要清除所有位,只需调用clear()
.
标准中的描述有点复杂,表述为其他函数的结果
void clear(iostate state = goodbit);
后置条件: If rdbuf()!=0
then state == rdstate();
否则rdstate()==(state | ios_base::badbit)
.
这基本上意味着下一次调用rdstate()
将返回传递给的值clear()
。除非存在其他问题,在这种情况下您可能会得到一个badbit
以及。
Also, goodbit
实际上根本不是一个位,而是值为零以清除所有其他位。
清除just一个特定的位,你可以使用这个调用
cin.clear(cin.rdstate() & ~ios::failbit);
但是,如果清除一个标志而保留其他标志,您仍然无法从流中读取数据。所以这种用途是相当有限的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)