正在检查标准输入上的等待输入
Checking for waiting input on standard input
是否有一种相对简单的方法可以检查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
相关文章:
- Bison/flex 在识别规则后等待输入
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 在线编译器 - 等待输入并自动馈送输入时拦截程序
- "cin >>变量"不等待输入
- QInputDialog & Ththreader(worker,show dialog,等待输入,继续)
- 我将如何连续更新变量,并同时等待输入
- 为什么"cin >> noskipws"不等待输入?
- 尽管Cin.ignore(),CIN不等待输入
- cin.getline() 等待输入
- 为什么"keep_window_open()"不等待输入字符?
- 在等待输入时执行无限循环
- istream_iterator CIN 初始化等待输入
- 一个好的,简单的,便携式的解决方案,用于等待输入C++
- 等待输入C++
- 等待输入C++时继续程序
- 正在检查标准输入上的等待输入
- c++循环永远运行而不等待输入
- Cin 没有等待输入
- fputs() 之后的第二个 fgets() 不等待输入
- 等待输入一段时间