2013-03-20 97 views
5

我想通过C++中的getline()从命令行读取一个字符串。如何实现getline()的超时?

为此,我想添加一个计时器5秒。如果没有字符串读取,那么程序将终止。

我该怎么做?

+0

@RandyHoward:我不认为这是一个确切的重复。 'getline()'使用起来更加简单,而且知道如何添加一个计数器对新手来说会很有用。这个问题应该保持合法。 – 2013-03-20 13:00:23

+0

@kassak:没有,仍然不是一个确切的副本,答案表明,我认为。无论哪种方式,我认为这是一个有用的问题,因为'getline()'被使用了很多,而且知道如何使用它会对未来的读者有好处。只是我2美分。 – 2013-03-20 13:06:25

+0

StackOverflow不是这个问题的适当位置。我们不会为您编写代码。你需要做自己的编码,如果你不确定为什么某些东西不能按预期工作,请在代码中加上一个解释你期望它做什么,以及它实际上在做什么,包括所有的错误信息。参见[关于StackOverflow](http://stackoverflow.com/about)。 – 2013-03-20 13:09:12

回答

4

如何:

/* Wait 5 seconds. */ 
alarm(5); 

/* getline */ 

/* Cancel alarm. */ 
alarm(0); 

另外,您可以使用setitimer


作为R. Martinho费尔南德斯请求:

功能alarm安排当前进程从其呼叫接收SIGALRM在5秒。 SIGALRM si用于异常终止进程的默认操作。拨打alarm(0)将禁用定时器。

+1

我不知道是否有办法关闭并重新打开stdin或其他东西来通过getline语句......? – sje397 2013-03-20 13:01:13

+0

@cnicutar Thnq。它的工作:P – 2013-03-20 13:04:47

+0

最后我得到输出作为“闹钟”。如何抑制那个?谢谢@cnicutar – 2013-03-20 13:05:58

7

OK,等待5秒,terminate如果没有输入:

#include <thread> 
#include <atomic> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::atomic<bool> flag = false; 
    std::thread([&] 
    { 
     std::this_thread::sleep_for(std::chrono::seconds(5)); 

     if (!flag) 
      std::terminate(); 
    }).detach(); 

    std::string s; 
    std::getline(std::cin, s); 
    flag = true; 
    std::cout << s << '\n'; 
} 
+0

+1标准解决方案,呵呵 – 2013-03-20 13:24:35

+0

不带线程pllzzz ... – 2013-03-20 13:35:51

+0

@ user2164410 - 为什么不 - 这是处理这种需求的常用方式。在5秒钟之前允许发送一个线路输入信号,而不是等到时间间隔结束。 – 2013-03-20 13:48:14