2012-12-21 286 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++腳本,調用。