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

时间:2011-02-10 17:17:49

标签: 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;
}

以下是我得到的输出:

g++ -Wall -ansi -pedantic -o boolio boolio.cpp
./boolio
0
0
1
1
2
i/o error
-
i/o error
t
i/o error
i/o error
i/o error
... (infinite loop)

我想知道为什么当我输入't'时我会得到一个无限循环,以及如何防止它。

感谢。

3 个答案:

答案 0 :(得分:3)

清除cin后添加此行:

std::cin.ignore();

这样,流忽略了缓冲区中剩余的内容。

答案 1 :(得分:1)

if (std::cin >> f)要求0或1.并将所有其他值视为I / 0错误。即使您输入“ - ”或2,仍然需要std::cin.ignore()

如果您希望程序只输入值 true或false ,请使用以下语句代替(std::cin >> f)

(std::cin >> boolalpha >> f)

答案 2 :(得分:1)

尝试使用以下组合:

cin.ignore(INT_MAX, '\n'); // ignore all characters in the current line

cin.clear(); // restore 'good' flag

仅使用cin.ignore()将仅丢弃缓冲区中的一个字符。