C++ std::cin.clear()无法将输入流恢复为良好状态
为了测试bool i/o,我尝试运行以下短程序:C++ std::cin.clear()无法将输入流恢复为良好状态,c++,iostream,C++,Iostream,为了测试bool i/o,我尝试运行以下短程序: #include <iostream> int main() { while(true) { bool f; if (std::cin >> f) std::cout << f << '\n'; else { std::cout << "i/o error\n"; std::cin.clear(); } } return 0; } 我想知
#include <iostream>
int main()
{
while(true)
{
bool f;
if (std::cin >> f)
std::cout << f << '\n';
else
{
std::cout << "i/o error\n";
std::cin.clear();
}
}
return 0;
}
我想知道为什么当我输入“t”时会出现一个无限循环,以及如何防止它
谢谢。在清除cin后添加此行:
std::cin.ignore();
这样,流将忽略其缓冲区中剩余的任何内容。if(std::cin>>f)
要求0或1。并将所有其他值视为I/0错误。即使输入“-”或2,仍然需要std::cin.ignore()
如果希望程序只输入值true或false,请使用以下语句,而不是(std::cin>>f)
(std::cin>>boolalpha>>f)
尝试使用以下组合:
cin.ignore(INT_MAX, '\n'); // ignore all characters in the current line
cin.clear(); // restore 'good' flag
仅使用
cin.ignore()
将只丢弃缓冲区中的一个字符。这很有效,谢谢。但我仍然不明白为什么“-”或“2”不需要它,而“t”需要它。因为bool被读取为long(除非使用boolalpha),然后检查为0或1。我想历史悠久。
cin.ignore(INT_MAX, '\n'); // ignore all characters in the current line
cin.clear(); // restore 'good' flag