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

时间:2013-08-31 19:33:41

标签: 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)
          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)语句之后)。

3 个答案:

答案 0 :(得分:8)

这对我有用(请注意,这在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;
}

答案 1 :(得分:3)

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

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

实现这一目标的最简单方法是使用ncurses库 - 特别是在Linux上。

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

答案 2 :(得分:2)

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

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

你要问的是,标准输入模型cin应该包装,并且不能实现为istream功能。

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