2013-08-31 42 views
3

我寫了一個小程序,在特定時間量之後,如何使從`的std :: cin`超時讀書

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)聲明)。

+1

[這個問題似乎很相似(http://stackoverflow.com/questions/10558934/while-loop - 即-犯規等待換CIN)。希望你覺得它有幫助 –

+0

我很驚訝沒有人發佈了一個使用C++ 11的線程的答案呢,我覺得這應該是可能的。 –

+0

@Santosh:我已經稍微編輯了這個問題。 –

回答

3

使用標準C或C++函數無法做到這一點。

有一些使用非標準代碼的方式,但你很可能不得不應對輸入可以是字符串或單個按鍵,而不是能夠讀取輸入像cin >> x >> y;其中xy是任意變量任何C++類型。

最簡單的方法是使用ncurses庫 - 特別是在Linux上。

timeout功能將允許您設置超時時間(毫秒),你可以使用getstr()讀取一個字符串,或scanw()到READ C scanf類型的輸入。

2

我對你有一個壞消息:cin不是一個聲明。它是std :: istream類型的對象,它重新映射操作系統默認映射到程序控制臺的標準輸入文件。

什麼塊不是cin,而是控制檯行編輯器,控制檯本身在用空緩衝區讀取標準輸入時調用。

你所要求的是在標準輸入模型之前,cin應該包裝,並且不能作爲istream功能實現。

唯一干淨的方法是使用控制檯的本地I/O功能來獲取用戶事件,並且只有在獲取了一些要分析的字符後才依賴於C++流。

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; 
} 
+3

Windows相當於'WaitForSingleObject'。請注意,在Windows上,標準輸入的HANDLE不固定,您必須使用'GetStdHandle'來檢索它。 –

+0

我建議使用[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)而不是'select' –