Вы можете использовать getline
, чтобы заставить программу ждать любой ввод с новой строкой:
#include <string>
#include <iostream>
#include <limits>
void wait_once()
{
std::string s;
std::getline(std::cin, s);
}
В общем, вы не можете просто "очистить" весь входной буфер и гарантировать, что этот вызов будет всегдаблок.Если вы знаете , что есть предыдущий ввод, который вы хотите удалить, вы можете добавить std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
над getline
, чтобы поглотить любые оставшиеся символы.Однако, если для начала не было никакого дополнительного ввода, это вызовет дополнительную паузу.
Если вы хотите получить полный контроль над консолью и клавиатурой, вам, возможно, придется взглянуть на решение для конкретной платформы, дляНапример, библиотека терминалов, такая как ncurses
.
A select
, вызывает в системе Posix, которая может сказать вам, заблокируется ли чтение из файлового дескриптора, поэтому вы можете написать функцию следующим образом:
#include <sys/select.h>
void wait_clearall()
{
fd_set p;
FD_ZERO(&p);
FD_SET(0, &p);
timeval t;
t.tv_sec = t.tv_usec = 0;
int sr;
while ((sr = select(1, &p, NULL, NULL, &t)) > 0)
{
char buf[1000];
read(0, buf, 1000);
}
}