Есть ли относительно простой способ проверить, есть ли вход, ожидающий ввода стандартного ввода в C++? И как я его читаю, если они есть?Проверка ожидающего ввода на стандартный ввод
В настоящее время я использую следующий код, но это действительно в основном C. Мне было интересно, есть ли лучший способ.
#ifdef WIN32
#include "windows.h"
#include "unistd.h"
#else
#include "sys/time.h"
#include "sys/select.h"
#endif
bool input_waiting()
{
#ifndef WIN32
fd_set readfds;
struct timeval tv;
FD_ZERO (&readfds);
FD_SET (fileno(stdin), &readfds);
tv.tv_sec=0; tv.tv_usec=0;
select(16, &readfds, nullptr, nullptr, &tv);
return (FD_ISSET(fileno(stdin), &readfds));
#else
static int init = 0, pipe;
static HANDLE inh;
DWORD dw;
if(!init)
{
init = 1;
inh = GetStdHandle(STD_INPUT_HANDLE);
pipe = !GetConsoleMode(inh, &dw);
if (!pipe)
{
SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT|ENABLE_WINDOW_INPUT));
FlushConsoleInputBuffer(inh);
}
}
if(pipe)
{
if (!PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL)) return 1;
return dw;
}
else
{
GetNumberOfConsoleInputEvents(inh, &dw);
return dw <= 1 ? 0 : dw;
}
#endif
}
Update: Это для шахматного двигателя, и эта функция вызывается каждые несколько тысяч узлов, чтобы проверить, если GUI послал остановки/выхода команды.
'cin.peek()', 'cin.get()' и др –
@IgorTandetnik Можете быть более конкретными? Я не принимаю никакого участия в std :: cin >> x; так что в потоке ничего не стоит заглянуть. Или я ошибаюсь? –
Возможно, вы ищете 'cin.readsome()' и/или 'cin.rdbuf() -> in_avail()' –