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

Checking for waiting input on standard input

本文关键字:等待 输入 标准输入 检查      更新时间:2023-10-16

是否有一种相对简单的方法可以检查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是否发送了停止/退出命令。

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

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

以下是MSDN的链接:

  • _kbhit():https://msdn.microsoft.com/en-us/library/58w7c94c.aspx
  • _getch():https://msdn.microsoft.com/en-us/library/078sfkak.aspx