Прочтите за несколько секунд на C ++ - PullRequest
4 голосов
/ 08 мая 2020

Я хочу знать, как я могу прочитать стандартный ввод всего за 5 секунд, как если бы у вас 5 секунд на запись.

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);
  cout << "Hello " << mystr << ".\n";
  cout << "What is your favorite team? ";
  getline (cin, mystr);
  cout << "I like " << mystr << " too!\n";
  return 0;
}

Как будто у пользователя есть все время, которое он хочет написать. Были ли у getline или read какие-либо опции, чтобы заставить getline останавливаться после 5se c?

Спасибо

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Возможное решение - использовать poll() и написать свою собственную getline() функцию (проверено на xubuntu 18.04 с g ++ 7.5.0):

Здесь реализация моего getline_timeout(int, std::string):

std::string getline_timeout(int ms, std::string def_value)
{
    struct pollfd fds;
    fds.fd = STDIN_FILENO;
    fds.events = POLLIN;

    int ret = poll(&fds, 1, ms);

    std::string val;
    if (ret > 0 && ((fds.revents & POLLIN) != 0)) {
        //cout << "has data" << endl;
        std::getline(std::cin, val);
    } else {
        //cout << "timeout / no data" << endl;
        val = def_value;
    }
    return val;
}

#include <iostream>
#include <string>

#include <poll.h>
#include <unistd.h>

std::string getline_timeout(int ms, std::string def_value);

int main(int argc, char *argv[])
{   
    std::cout << "What's your name ? " << std::flush;

    // Ask for the name
    std::string mystr = getline_timeout(5000, "John Doe");

    std::cout << "Hello " << mystr << std::endl;
    std::cout << "What is your favorite team ? " << std::flush;

    // Ask for the team
    mystr = getline_timeout(5000, "Gryffindor");

    std::cout << "I like " << mystr << " too!" << std::endl;

    return 0;
}
0 голосов
/ 08 мая 2020

API getline() не может делать то, что вы хотите. Есть два способа, которые вы можете попробовать: - может работать многопоточность - одиночный поток с мультиплексированием ввода-вывода, например select / poll / epoll / iocp

Фактически, они работают одинаково: установка таймера и ожидание ввода / вывода или тайм-аут.

...