Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::cin.clear()无法将输入流恢复为良好状态_C++_Iostream - Fatal编程技术网

C++ std::cin.clear()无法将输入流恢复为良好状态

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; } 我想知

为了测试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;
}
我想知道为什么当我输入“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