用C++清除键盘缓冲区

Ara*_*hdn 2 c++

我用过的应用程序的一部分Sleep(5000)(我需要等待5秒)

问题是如果用户在这5秒钟内按下任何键盘键,睡眠后将读取键,这会导致我的应用程序出现问题.

睡觉后如何清空缓冲区?

我尝试过cin.clear(),setbuf(stdin, NULL)但如果缓冲区中有多个字符,则无法清除缓冲区.

Die*_*ühl 6

您正在使用的两个功能没有您期望它们具有的效果:

  1. clear()根本不会影响缓冲区,而是清除错误标志.也就是说,如果读取不成功,则设置标志(std::ios_base::failbit).虽然设置了任何错误标志(还有一些),但流不会尝试读取任何内容.
  2. setbuf(0, 0)影响流的内部缓冲区不存在(具有非空值的调用具有实现定义的含义,通常是"什么都不做").这通常是一个坏主意,因为它会导致流非常慢.此外,用户按下的键可能不会存储在此缓冲区中,而是存储在操作系统输入缓冲区中,直到它们被发送到应用程序(有平台特定方式关闭操作系统输入缓冲区,例如,在POSIX上"D使用tcsetattr()设定输入到非规范模式).

在任何一种情况下,没有缓冲区并不能真正帮助你:用户可能已经输入了有效的输入.正确的方法是尝试读取可用的输入,如果失败,则去除违规的字符(或字符).为此,您将尝试读取输入,如果它失败,您将clear()使用流和ignore()一个或多个字符(此示例忽略整行; ignore()不带参数调用只忽略一个字符):

T value;
while (!(std::cin >> value)) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Run Code Online (Sandbox Code Playgroud)

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