清除键盘缓冲器
我在我的申请的一个部分,我已经使用Sleep(5000)
(I需要等待5秒)清除键盘缓冲器
的问题是,如果用户按下这些5秒内任何键盘的键,键将在睡眠之后阅读并导致我的应用出现问题。
如何在睡眠后清空缓冲区?
我试过cin.clear()
和setbuf(stdin, NULL)
但是如果缓冲区中有多个字符,他们不能清除缓冲区。
两个功能使用的是没有你期望他们有效果:
-
clear()
不影响缓冲可言,而是清除错误标志。也就是说,如果读取失败,则设置标志(std::ios_base::failbit
)。当设置任何错误标志(还有更多)时,流不会尝试读取任何内容。 -
setbuf(0, 0)
影响流的内部缓冲区不存在(具有非空值的调用具有实现定义的含义,通常是“什么都不做”)。这通常是一个糟糕的想法,因为它会导致流很慢。此外,用户按下的按键可能不会存储在此缓冲区中,而是存储在操作系统输入缓冲区中,直到它们被发送到应用程序(有特定于平台的方式关闭操作系统输入缓冲区,例如在POSIX上'使用tcsetattr()
将输入设置为非规范模式)。
在任何一种情况下,没有缓冲区并不能真正帮助您:用户可能已经输入了有效的输入。正确的做法是尝试阅读可用的输入,如果失败,则去除违规字符(或字符)。为此你会试图读取输入,如果失败你最好clear()
流和ignore()
一个或多个字符(这个例子忽略了整条生产线;拨打ignore()
不带参数只是忽略一个字符):
T value;
while (!(std::cin >> value)) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
无论如何,您总是需要验证输入是否成功,少数额外的行只是添加一些恢复代码。
我是一个初学者,什么是T值? – Arashdn
'T'是任何支持格式化输入的类型(使用'>>'),例如'int','double','std :: string'等等。你的问题没有提到你试图阅读的东西,它也开放。 –
来清除键盘输入缓冲区的最简单方法是
while(kbhit()) getch();
只是把这些代码在你的程序,无论你想清除您的缓冲。需要为
headerfile是CONIO.H
这似乎为Windows 10使用代码:: Blocks的编译工作:
#include <conio.h>
/**
* clears keyboard buffer
*
* @author Shaun B
* @version 0.0.2
* @fixed 15-01-2016
*/
void clearKeyboardBuffer()
{
while (_kbhit())
{
_getche();
}
}
然后从需要在你的C++脚本,调用。
http://stackoverflow.com/questions/9763911/how-to-clear-the-stdin-stream – 1615903