如何在特定的时间之后从`std :: cin`超时读取数据

我写了一个小程序,

int main(int argc, char *argv[]) { int n; std::cout << "Before reading from cin" << std::endl; // Below reading from cin should be executed within stipulated time bool b=std::cin >> n; if (b) std::cout << "input is integer for n and it's correct" << std::endl; else std::cout << "Either n is not integer or no input for n" << std::endl; return 0; } 

std::cin读取被阻塞,因此程序一直等待,直到有一个外部中断(如同样的信号)到程序或用户提供了一些input。

我应该如何使声明std::cin >> n等待一段时间(也许使用sleep()系统调用)为用户input? 如果用户没有提供input,并且在完成规定的时间(比如10秒)之后,程序应该继续下一条指令(即if (b==1)语句向前)。

这适用于我(请注意,这不会在Windows下工作):

 #include <iostream> #include <sys/select.h> using namespace std; int main(int argc, char *argv[]) { int n; cout<<"Before performing cin operation"<<endl; //Below cin operation should be executed within stipulated period of time fd_set readSet; FD_ZERO(&readSet); FD_SET(STDIN_FILENO, &readSet); struct timeval tv = {10, 0}; // 10 seconds, 0 microseconds; if (select(STDIN_FILENO+1, &readSet, NULL, NULL, &tv) < 0) perror("select"); bool b = (FD_ISSET(STDIN_FILENO, &readSet)) ? (cin>>n) : false; if(b==1) cout<<"input is integer for n and it's correct"<<endl; else cout<<"Either n is not integer or no input for n"<<endl; return 0; } 

使用标准的C或C ++函数无法做到这一点。

有很多方法使用非标准的代码,但是你很可能不得不把输入作为一个字符串或单独的按键来处理,而不是像cin >> x >> y;那样读取输入cin >> x >> y; 其中xy是任何C ++类型的任意变量。

最简单的方法是使用ncurses库 – 特别是在Linux上。

timeout函数将允许您设置超时(以毫秒为单位),您可以使用getstr()读取字符串,或使用scanw()读取C扫描格式输入。

我对你有一个坏消息:cin不是一个声明。 它是一个std :: istream类型的对象,它将默认映射到您的程序控制台的标准输入文件重新映射。

哪些块不是cin,而是控制台行编辑器,控制台本身在用空的缓冲区读取标准输入时调用。

你所要求的是在标准输入模型之前,cin应该包装,并且不能作为istream功能实现。

唯一干净的方法是使用控制台的本地I / O功能来获取用户事件,并且只有在获得了一些要解析的字符之后才能依赖C ++流。