2015-12-05 3 views
0

Есть ли относительно простой способ проверить, есть ли вход, ожидающий ввода стандартного ввода в 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 послал остановки/выхода команды.

+0

'cin.peek()', 'cin.get()' и др –

+0

@IgorTandetnik Можете быть более конкретными? Я не принимаю никакого участия в std :: cin >> x; так что в потоке ничего не стоит заглянуть. Или я ошибаюсь? –

+0

Возможно, вы ищете 'cin.readsome()' и/или 'cin.rdbuf() -> in_avail()' –

ответ

0

Вы можете использовать _kbhit() и _getch() от conio.h.

Первая функция возвращает ненулевое значение, если нажата клавиша и нажатие клавиши в буфере. Второй возвращает это нажатие клавиши в качестве символа (или, если ни одна клавиша не была нажата, блокирует поток и ждет нажатия клавиши от пользователя).

Вот ссылки на MSDN:

+0

Нет «нажатия клавиши». Это команда, отправленная из другой программы в стандартный ввод. –