是否有一种相对简单的方法来检查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是否发送了一个停止/退出命令。
答案 0 :(得分:0)
您可以使用_kbhit()
标题中的_getch()
和conio.h
。
如果按下了键并且按键在缓冲区中等待,则第一个函数返回非零值。第二个将键击返回为字符(或者,如果没有按下键,则锁定线程并等待用户的击键)。
以下是MSDN的链接: