簡體   English   中英

在C ++中清除鍵盤緩沖區

[英]Clearing keyboard buffer in C++

我的應用程序的一部分我使用了Sleep(5000) (我需要等待5秒)

問題是如果用戶在這5秒鍾內按下任何鍵盤鍵,睡眠后將讀取鍵,這會導致我的應用程序出現問題。

睡眠后如何清空緩沖區?

我嘗試了cin.clear()setbuf(stdin, NULL)但是如果緩沖區中有多個字符,它們將無法清除緩沖區。

您正在使用的兩個功能沒有您期望它們具有的效果:

  1. clear()根本不影響緩沖區,而是清除錯誤標志。 也就是說,如果讀取不成功,則設置標志( std::ios_base::failbit )。 雖然設置了任何錯誤標志(還有一些),但流不會嘗試讀取任何內容。
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM