清除c++中的键盘缓冲区
Clearing keyboard buffer in C++
如果我的应用程序的一部分我使用了Sleep(5000)
(我需要等待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');
}
您总是需要验证输入是否成功,而额外的几行只是添加了一些恢复代码。
清除键盘输入缓冲区的最简单方法是
while(kbhit()) getch();
只要把这段代码放到程序中你想要清空缓冲区的地方。
需要的头文件是conio.h
这似乎适用于使用Code::Blocks:
编译的Windows 10#include <conio.h>
/**
* clears keyboard buffer
*
* @author Shaun B
* @version 0.0.2
* @fixed 15-01-2016
*/
void clearKeyboardBuffer()
{
while (_kbhit())
{
_getche();
}
}
然后从c++脚本中需要的地方调用
相关文章:
- C++字符*缓冲区的大小
- 物理键盘上的触发器按键
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- 如何使用C/C++在MacOSX中获得键盘布局
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 是否可以在键盘输入缓冲区中向前看并在MFC/Win32中检测条形码条目
- 清除c++中的键盘缓冲区