C++ 如何在特定时间后使读取'std::cin'超时
我写了一个小程序C++ 如何在特定时间后使读取'std::cin'超时,c++,linux,C++,Linux,我写了一个小程序 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)
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;
}
intmain(intargc,char*argv[])
{
int n;
标准::cout n;
如果(b)
STD::CUT< P>没有使用标准C或C++函数的方法。
使用非标准代码有很多种方法,但您可能最需要处理输入,如字符串或个别按键,而不是能够读取输入如“代码> CIN > X>>Y;代码< > X和Y 是任意C++类型的任意变量。
实现这一点的最简单方法是使用ncurses库,尤其是在Linux上
timeout
函数允许您设置超时(以毫秒为单位),您可以使用getstr()
读取字符串,或scanw()
阅读C scanf风格的输入。我有一个坏消息告诉你:cin不是一个语句。它是一个std::istream类型的对象,它将默认情况下操作系统映射到程序控制台的标准输入文件重新映射
块不是cin,而是控制台在使用空缓冲区读取标准输入时调用的控制台行编辑器
您所要求的超出了标准输入模型cin应该包装的范围,不能作为istream功能实现
唯一的干净方法是使用控制台的本地I/O功能,以获得用户事件,并且最终-只在有一些字符要解析之后依赖C++流。
< P>这对我起作用(注意,这在Windows下不适用):
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
int n;
cout.希望您能找到帮助我很惊讶还没有人用C++11的线程发布答案,我觉得这肯定是可能的。@Santosh:我对这个问题做了一些编辑。@BenjaminBannier刚刚发布了一个使用C++11线程的黑客版本:Windows等价物是WaitForSingleObject
。请注意,在Windows上标准输入的ANDLE不是固定的,您必须使用GetStdHandle
检索它。我建议使用而不是select
#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;
}