【问题标题】:std::cin.clear() fails to restore input stream in a good statestd::cin.clear() 无法将输入流恢复为良好状态
【发布时间】:2011-02-10 17:17:48
【问题描述】:

为了测试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'时会出现无限循环,以及如何防止它。

谢谢。

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    清除cin后添加这一行:

    std::cin.ignore();
    

    这样,流将忽略其缓冲区中剩余的任何内容。

    【讨论】:

    • 这行得通,谢谢。但我仍然不明白为什么'-'或'2'不需要它,而't'需要它。
    • 因为 bool 被读取为 long(除非你使用 boolalpha),然后检查它是 0 还是 1。我猜是很长的历史。
    【解决方案2】:

    尝试使用以下组合:

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

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

    【讨论】:

      【解决方案3】:

      if (std::cin &gt;&gt; f) 期望 0 或 1。并将所有其他值视为 I/0 错误。即使您输入 '-' 或 2,仍然需要 std::cin.ignore()

      如果您希望程序仅输入值 true 或 false,请使用以下语句而不是 (std::cin &gt;&gt; f)

      (std::cin &gt;&gt; boolalpha &gt;&gt; f)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 2022-09-27
        • 2011-01-17
        • 1970-01-01
        • 2016-09-03
        相关资源
        最近更新 更多