Я хотел бы очистить входной буфер, но не знаю, как, heres код, пожалуйста, попробуйте сами:
#include <windows.h>
using namespace std;
int main()
{
do {
Sleep(500);
if (kbhit())
cout << (char) getch() << endl;
} while(1);
}
Если я спам-клавиатуру, буквы будут печататься один за другим, каждый задерживается на 500 мс.
Как очистить весь буфер ввода, и появится только одна буква, даже если я нажму несколько
Итак, вы пишете консольное приложение Windows. Не DOS, а не межплатформенная совместимость.
Вы можете использовать функции консоли Windows. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx.
В частности, вы можете получить дескриптор с GetStdHandle, затем WaitForSingleObject на дескрипторе. Вероятно, с тайм-аутом 500 мс вместо текущего спящего режима.
Затем вы должны иметь возможность ReadConsole читать все входные данные, которые были буферизованы с момента последнего его чтения. Если вам нужен первый символ или последний символ, вы просто возьмете его.
Есть много деталей, которые вам нужно будет добавить ко всему этому, чтобы он действительно работал.
Это зависит от того, как именно вы хотите, чтобы поведение было. Поскольку вы не указали это подробно, вот два, которые я предложу:
// ...
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
миллисекунд все время; в то время как во второй версии ваши нажатия клавиш появятся сразу, если они появятся (т.е. были выведены из кулдауна).
kbhit
иgetch
недоступны из<windows.h>
. Каков ваш настоящий список включает?