> n; if (b)" />

Как сделать чтение из `std :: cin` тайм-аута через определенное время

c++ linux

7440 просмотра

3 ответа

Я написал небольшую программу,

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)Е. Оператора и далее).

Автор: Santosh Sahu Источник Размещён: 12.11.2019 09:28

Ответы (3)


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;
}
Автор: Jeremy Friesner Размещён: 31.08.2013 08:06

3 плюса

Нет никакого способа сделать это, используя стандартные функции C или C ++.

Существует несколько способов использования нестандартного кода, но вам, скорее всего, придется иметь дело с вводом либо в виде строки, либо с отдельными нажатиями клавиш, а не с возможностью читать ввод, например, cin >> x >> y;где xи yявляются произвольными переменными любого типа C ++.

Самый простой способ добиться этого - использовать библиотеку ncurses, особенно в Linux.

timeoutФункция позволит установить тайм - аут (в миллисекундах) , и вы можете использовать getstr()для чтения строки, или scanw()читать Ĉ Scanf ввода стиля.

Автор: Mats Petersson Размещён: 31.08.2013 07:43

2 плюса

У меня для вас плохие новости: cin - это НЕ ЗАЯВЛЕНИЕ. Это объект типа std :: istream, который преобразует стандартный входной файл, который ваша ОС по умолчанию отображает на консоль вашей программы.

То, что блокирует, это не cin, а редактор строк консоли, который сама консоль вызывает, когда стандартный ввод читается с пустым буфером.

То, что вы просите, идет впереди стандартной входной модели, которую должен обернуть cin, и не может быть реализовано как функциональность istream.

Единственный чистый способ сделать это - использовать встроенную функциональность ввода-вывода консоли, чтобы получать пользовательские события, и, в конечном итоге, полагаться на потоки C ++ только после того, как вы проанализируете некоторые символы.

Автор: Emilio Garavaglia Размещён: 31.08.2013 07:44
Вопросы из категории :
32x32