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には、5秒後にgetlineを強制的に停止するオプションがありましたか?
ありがとうございました
可能な解決策は 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;
}
API getline()
は、望んだことを実行できません。あなたが試すことができる2つの方法があります:-マルチスレッドは機能することができます-多重化を伴うシングルスレッドIO select/poll/epoll/iocpのように
実際、これらは同じように機能します。タイマーを設定し、I/O入力またはタイムアウトを待ちます。