2013-03-20 89 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