очистка буфера пользовательского ввода в c / c ++

0

Я хотел бы очистить входной буфер, но не знаю, как, heres код, пожалуйста, попробуйте сами:

#include <windows.h>

using namespace std;

int main()
{
    do {
        Sleep(500);
        if (kbhit())
            cout << (char) getch() << endl;
    } while(1);
}

Если я спам-клавиатуру, буквы будут печататься один за другим, каждый задерживается на 500 мс.

Как очистить весь буфер ввода, и появится только одна буква, даже если я нажму несколько

  • 1
    Я вполне уверен, что kbhit и getch недоступны из <windows.h> . Каков ваш настоящий список включает?
  • 0
    это действительно имеет значение? я включил <conio.h> и <iostream>, но для задержки требуются окна, теперь вы можете мне помочь, пожалуйста?
Показать ещё 1 комментарий
Теги:
input
buffer

2 ответа

0

Итак, вы пишете консольное приложение Windows. Не DOS, а не межплатформенная совместимость.

Вы можете использовать функции консоли Windows. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx.

В частности, вы можете получить дескриптор с GetStdHandle, затем WaitForSingleObject на дескрипторе. Вероятно, с тайм-аутом 500 мс вместо текущего спящего режима.

Затем вы должны иметь возможность ReadConsole читать все входные данные, которые были буферизованы с момента последнего его чтения. Если вам нужен первый символ или последний символ, вы просто возьмете его.

Есть много деталей, которые вам нужно будет добавить ко всему этому, чтобы он действительно работал.

  • 0
    Разве это не будет сложнее, чем метод, описанный выше, который использует getch () и kbhit ()? или мне чего-то не хватает?
0

Это зависит от того, как именно вы хотите, чтобы поведение было. Поскольку вы не указали это подробно, вот два, которые я предложу:

// ...
do {
    Sleep( 500 );
    if ( kbhit( ) ) {
        cout << (char) getch( ) << endl;
        while ( kbhit( ) )
            getch( );
    }
} while ( 1 );
// ...

Добавление в while циклы внутри там, очищает оставшиеся нажатия клавиш внутри буфера. Он делает это, проверяя условие, если есть оставшееся нажатие клавиши, и в этом случае его отбрасывание.

Хотя это, кажется, то, что вы хотите от того, как вы просили, я хотел бы предложить следующее, которое, по моему мнению, будет гораздо более плавным:

// ...
do {
    cout << (char) getch( ) << endl;
    Sleep( 500 );
    while ( kbhit( ) )
        getch( );
} while ( 1 );
// ...

То, как он становится более плавным, не будет распознаваться с задержкой, как 500, но поднять ее до 2500 и вы поймете, что я имею в виду. В первой версии ваши нажатия клавиш будут задерживаться на 0 ~ 500/2500 миллисекунд все время; в то время как во второй версии ваши нажатия клавиш появятся сразу, если они появятся (т.е. были выведены из кулдауна).

  • 0
    Спасибо, парень, это было именно то, что я искал, просто объясню, почему мне нужен первый вариант. я играю в игру «змея» (первый в истории крупный проект) и хочу, чтобы «змея» продолжала двигаться, даже если клавиша не была нажата (поэтому, если (kbhit ())), я не могу дождаться ввода, потому что, пока жду ввода, змея (фреймы) не двигается вообще. Также не могли бы вы предложить мне какой-нибудь большой консольный проект, который было бы интересно взять? С уважением.
  • 0
    @gsdag Нет проблем, брат. Разверните ваш проект Snake в мультиплеер (два игрока, которые будут играть, используя одну и ту же клавиатуру, WASD и стрелки), сначала разработайте игровой процесс; или крестики-нолики с опциями для одиночной и многопользовательской игры, в одиночку против беспрерывного ИИ (не исключено, лично я знаю алгоритмы, которые в любом случае предотвращают потери). Или что-то еще, я не знаю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню