检查标准输入上的等待输入

时间:2015-12-05 20:45:29

标签: c++ input cin

是否有一种相对简单的方法来检查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
}

更新:它是一个国际象棋引擎,每隔几千个节点调用一次这个函数来检查GUI是否发送了一个停止/退出命令。

1 个答案:

答案 0 :(得分:0)

您可以使用_kbhit()标题中的_getch()conio.h

如果按下了键并且按键在缓冲区中等待,则第一个函数返回非零值。第二个将键击返回为字符(或者,如果没有按下键,则锁定线程并等待用户的击键)。

以下是MSDN的链接: