根据我的阅读,cin.clear()
重置了标志,但是如何清除输入缓冲区呢?
答案 0 :(得分:3)
cin.clear()
对输入缓冲区没有影响。正确阅读后,它会重置iostate
标志(从技术上讲,用std::ios_base::goodbit
替换当前值)
答案 1 :(得分:2)
std::ios::clear()
仅重置错误标志。如果存在例如没有流缓冲器(即stream.rdbuf()
产生nullptr
),则std::ios_base::badbit
仍然保持设置。这是唯一的影响。特别是,std::ios_base::clear()
不会从输入缓冲区中删除任何字符。
如果需要从输入缓冲区中删除字符,则需要明确地执行此操作。例如,您可以使用
stream.ignore();
无条件删除下一个字符(如果有的话;如果没有,则流将设置std::ios_base::eofbit
。)stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
删除所有字符,包括遇到的第一个'\n'
字符。ignore()
个字符而stream.peek()
会产生您不喜欢的字符类(例如isdigit(stream.peek())
会产生false
)答案 2 :(得分:1)
cin.clear()不清除缓冲区,它只覆盖标志的当前值。 有关详细信息,请访问此链接 - &gt; http://www.cplusplus.com/reference/ios/ios/clear/
你可以在这个链接中找到一个很好的例子 - &gt; http://web.eecs.utk.edu/~plank/plank/classes/cs102/Cin-Notes/
答案 3 :(得分:1)
确实cin.clear()
对输入缓冲区没有影响,它只为流的内部错误状态标志设置一个新值。
如果您要清除“破坏”流的字符,则必须使用cin.ignore()
(例如cin.ignore(10000,'\n');
)
您可以在此处找到一个很好的解释:http://www.arachnoid.com/cpptutor/student1.html