2012-12-21 297 views
2

我在我的申请的一个部分,我已经使用Sleep(5000)(I需要等待5秒)清除键盘缓冲器

的问题是,如果用户按下这些5秒内任何键盘的键,键将在睡眠之后阅读并导致我的应用出现问题。

如何在睡眠后清空缓冲区?

我试过cin.clear()setbuf(stdin, NULL)但是如果缓冲区中有多个字符,他们不能清除缓冲区。

+0

http://stackoverflow.com/questions/9763911/how-to-clear-the-stdin-stream – 1615903

回答

5

两个功能使用的是没有你期望他们有效果:

  1. clear()不影响缓冲可言,而是清除错误标志。也就是说,如果读取失败,则设置标志(std::ios_base::failbit)。当设置任何错误标志(还有更多)时,流不会尝试读取任何内容。
  2. 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'); 
} 

无论如何,您总是需要验证输入是否成功,少数额外的行只是添加一些恢复代码。

+0

我是一个初学者,什么是T值? – Arashdn

+0

'T'是任何支持格式化输入的类型(使用'>>'),例如'int','double','std :: string'等等。你的问题没有提到你试图阅读的东西,它也开放。 –

0

来清除键盘输入缓冲区的最简单方法是

while(kbhit()) getch(); 

只是把这些代码在你的程序,无论你想清除您的缓冲。需要为

headerfile是CONIO.H

0

这似乎为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++脚本,调用。