我在我的申請的一個部分,我已經使用Sleep(5000)
(I需要等待5秒)清除鍵盤緩衝器
的問題是,如果用戶按下這些5秒內任何鍵盤的鍵,鍵將在睡眠之後閱讀並導致我的應用出現問題。
如何在睡眠後清空緩衝區?
我試過cin.clear()
和setbuf(stdin, NULL)
但是如果緩衝區中有多個字符,他們不能清除緩衝區。
我在我的申請的一個部分,我已經使用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