2012-11-09 77 views
1

我有一個簡單的程序,啓動一個循環計時器,然後安置到解析任何輸入數據的getline循環中。但是,每當發生定時器信號時,就會結束getline函數,這看起來好像用戶按下了輸入。我怎樣才能阻止這樣做的信號?否則,我該如何區分真正的返回印刷機和信號?後者不太理想,因爲我將不得不以400Hz運行這個差異代碼。std :: getline和posix信號

以下是我目前使用的代碼來獲取一行。一個空白輸入將重新打印APP>行,而任何其他輸入通過。

do 
    { 
     std::cin.clear(); 
     line.clear(); 
     std::cout << "APP > "; 
     std::getline(std::cin, line); 
    } 
    while (line.length() == 0); 

感謝所有

馬特

+1

你不檢查'std :: cin'的狀態。我想知道在鬧鐘響起後是否設置了故障位。 –

+0

阿哈,似乎是沿着正確的路線。我以前嘗試過比較failbit和badbit的直接狀態而沒有運氣,但是似乎使用fail()函數可以做到這一點。謝謝! –

+0

我發表了評論一個答案,以便您可以關閉此問題。 –

回答

0

你不檢查的std::cin狀態。我想知道在鬧鐘響起後是否設置了故障位。

0

我不明白你的問題,我也不能重現它。以下程序正確地從stdin中讀取處理信號;既不妨礙另一個:

#include <csignal> 
#include <cstdlib> 
#include <string> 
#include <iostream> 

void handle(int n) 
{ 
    static unsigned int count = 0; 

    std::cout << "Signal: " << n << std::endl; // not safe, I know... 

    if (++count == 5) 
    { 
     std::cout << "Too many signals, goodbye!\n"; 
     std::exit(0); 
    } 
} 

int main() 
{ 
    std::signal(SIGINT, handle); 

    for (std::string line; std::getline(std::cin, line);) 
    { 
     std::cout << "You said: " << line << std::endl; 
    } 

    std::cout << "End of input, goodbye!\n"; 
}