[英]Clearing keyboard buffer in C++
我的應用程序的一部分我使用了Sleep(5000)
(我需要等待5秒)
問題是如果用戶在這5秒鍾內按下任何鍵盤鍵,睡眠后將讀取鍵,這會導致我的應用程序出現問題。
睡眠后如何清空緩沖區?
我嘗試了cin.clear()
和setbuf(stdin, NULL)
但是如果緩沖區中有多個字符,它們將無法清除緩沖區。
您正在使用的兩個功能沒有您期望它們具有的效果:
clear()
根本不影響緩沖區,而是清除錯誤標志。 也就是說,如果讀取不成功,則設置標志( std::ios_base::failbit
)。 雖然設置了任何錯誤標志(還有一些),但流不會嘗試讀取任何內容。 setbuf(0, 0)
影響流的內部緩沖區不存在(具有非null值的調用具有實現定義的含義,通常是“不執行任何操作”)。 這通常是一個壞主意,因為它會導致流非常慢。 此外,用戶按下的鍵可能不會存儲在此緩沖區中,而是存儲在操作系統輸入緩沖區中,直到它們被發送到應用程序(有平台特定方式關閉操作系統輸入緩沖區,例如,在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 ++腳本中需要的地方調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.