Как сделать чтение из `std :: cin` тайм-аута через определенное время
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)
Е. Оператора и далее).
Ответы (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 ввода стиля.
2 плюса
У меня для вас плохие новости: cin - это НЕ ЗАЯВЛЕНИЕ. Это объект типа std :: istream, который преобразует стандартный входной файл, который ваша ОС по умолчанию отображает на консоль вашей программы.
То, что блокирует, это не cin, а редактор строк консоли, который сама консоль вызывает, когда стандартный ввод читается с пустым буфером.
То, что вы просите, идет впереди стандартной входной модели, которую должен обернуть cin, и не может быть реализовано как функциональность istream.
Единственный чистый способ сделать это - использовать встроенную функциональность ввода-вывода консоли, чтобы получать пользовательские события, и, в конечном итоге, полагаться на потоки C ++ только после того, как вы проанализируете некоторые символы.
Автор: Emilio Garavaglia Размещён: 31.08.2013 07:44Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- c++ В чем разница между #include <filename> и #include "filename"?
- c++ Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- c++ Как преобразовать std :: string в LPCWSTR в C ++ (Unicode)
- c++ Regular cast vs. static_cast vs. dynamic_cast
- linux Как отправить файл в виде вложения электронной почты с помощью командной строки Linux?
- linux Как разделить два 64-битных числа в ядре Linux?
- linux Изучение файлов Беркли БД из CLI
- linux Как передать пароль на scp?
- linux Как показать все общие библиотеки, используемые исполняемыми файлами в Linux?
- linux Кроссплатформенное пространство, оставшееся на томе с использованием Python
- linux Как использовать sudo для перенаправления вывода в местоположение, в которое у меня нет разрешения на запись?
- linux Определить, существует ли функция в bash
- linux Используйте grep для поиска содержимого в файлах и перемещения их, если они совпадают
- linux Есть ли способ проверить, есть ли символические ссылки, указывающие на каталог?