1

繰り返しタイマーを開始し、入力データを解析する getline ループに落ち着く単純なプログラムがあります。ただし、タイマー シグナルが発生するたびに getline 関数が終了します。これは、ユーザーが Enter キーを押したかのように見えます。これを行う信号を停止するにはどうすればよいですか? または、それができない場合、純正のリターン プレスと信号をどのように区別できますか? この微分コードを 400Hz で実行する必要があるため、後者はあまり望ましくありません。

以下は、現在行を取得するために使用しているコードです。空白の入力は APP > 行を再表示しますが、他の入力は通過します。

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

皆さんありがとう

マット

4

2 に答える 2

0

の状態をチェックしませんstd::cin。アラームが鳴った後、フェイルビットがセットされるのだろうか。

于 2012-11-09T20:46:32.297 に答える
-1

私はあなたの問題を理解していませんし、それを再現することもできません。次のプログラムは、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";
}
于 2012-11-09T20:48:34.630 に答える