如何使“std::cin”读取在特定时间后超时
- 2024-10-24 08:50:00
- admin 原创
- 89
问题描述:
我写了一个小程序,
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
是阻塞的,因此程序会等待,直到有外部中断(也如信号)或用户提供一些输入。
我应该如何让语句std::cin >> n
等待一段时间(可能使用sleep()
系统调用)以便用户输入?如果用户没有提供输入,并且在规定的时间(比如说 10 秒)完成后,程序应该恢复执行下一条指令(即if (b==1)
语句之后)。
解决方案 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;
}
解决方案 2:
无法使用标准 C 或 C++ 函数来实现这一点。
使用非标准代码的方法有很多,但您很可能必须将输入作为字符串或单独的按键来处理,而不是能够读取像cin >> x >> y;
其中x
和y
是任何 C++ 类型的任意变量这样的输入。
实现此目的的最简单方法是使用 ncurses 库 - 特别是在使用 Linux 时。
该timeout
函数将允许您设置超时(以毫秒为单位),并且您可以用它getstr()
来读取字符串,或者scanw()
读取 C scanf 样式的输入。
解决方案 3:
我有一个坏消息要告诉你:cin 不是一个语句。它是一个 std::istream 类型的对象,它将操作系统默认映射到程序控制台的标准输入文件重新映射。
阻塞的不是 cin,而是在使用空缓冲区读取标准输入时控制台本身调用的控制台行编辑器。
您所要求的内容超出了标准输入模型 cin 应该换行的范围,并且不能作为 istream 功能来实现。
唯一干净的方法是使用控制台的本机 I/O 功能来获取用户事件,并且最终只有在需要解析一些字符后才依赖 C++ 流。
解决方案 4:
基于 c++ 标准的干净解决方案,跨平台、紧凑且可重复使用,适用于 c++11 标准及更新版本
#include <iostream>
#include<thread>
#include<string>
class Time_Limited_Input_Reader{
public:
std::string Input;
void operator()(){
Time_Limited_Input_Reader Input_Reader;
std::cout<<"enter inp"<<std::endl;
std::thread Read_Input(&Time_Limited_Input_Reader::Read,this);
Read_Input.detach();
std::this_thread::sleep_for(std::chrono::seconds(5));
Read_Input.~thread();
}
private:
void Read(){
Input = "nothing entered";
std::cin>>Input;
}
};
int main(){
Time_Limited_Input_Reader Input_Reader;
Input_Reader();
std::cout<<"Input Data : "<<Input_Reader.Input<<std::endl;
}
解决方案 5:
可能会有用:
auto read_input = [&]() {
std::string input;
std::cin >> input;
return input;
};
std::future<std::string> future_input;
while (1) {
if (!future_input.valid())
future_input = std::async(read_input);
if (future_input.wait_for(std::chrono::milliseconds(1000)) == std::future_status::ready) {
std::string s = future_input.get();
if (s == "q") {
break;
}
}
}
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD