How to make reading from `std::cin` timeout after a particular amount of time

后端 未结 3 421
别那么骄傲
别那么骄傲 2020-11-27 22:40

I have written a small program,

int main(int argc, char *argv[])
{
    int n;
    std::cout << \"Before reading from cin\" << std::endl;

    //          


        
相关标签:
3条回答
  • 2020-11-27 22:50

    There is no way to do this using standard C or C++ functions.

    There are a number of ways using non-standard code, but you will most likely have to deal with input either as a string or individual keypresses, rather than being able to read input like cin >> x >> y; where x and y are arbitrary variables of any C++ type.

    The easiest way to achieve this would be to use the ncurses library - in particular as you are on Linux.

    The timeout function will allow you to set a timeout (in milliseconds) and you can use getstr() to read a string, or scanw() to read C scanf style input.

    0 讨论(0)
  • 2020-11-27 23:04

    I have a bad news for you: cin is NOT A STATEMENT. It is an object of type std::istream that remaps the standard input file that your OS maps by default to your program's console.

    What blocks is not cin, but the console line editor that the console itself invokes when the standard input is read with an empty buffer.

    What you are asking goes ahead of the standard input model cin is supposed to wrap, and cannot be implemented as a istream functionality.

    The only clean way to do it is using the native I/O functionality of the console, to get user events, and -eventually- rely on C++ streams only after you've got some characters to be parsed.

    0 讨论(0)
  • 2020-11-27 23:11

    This works for me (note that this wouldn't work under Windows though):

    #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;
    }
    
    0 讨论(0)
提交回复
热议问题