4

としてFIFOファイルを開きますifstream。オブジェクトが作成されるとすぐに、FIFO に何かを送信するまでスレッドはブロックされます (これは私にとっては問題ありません)。getline()次に、ストリームからデータを取得するために呼び出します。

より多くのデータが FIFO ファイルに書き込まれるまで、スレッドを再度読み取りブロックするにはどうすればよいですか?

ありがとう

4

3 に答える 3

3

私はこのコードをテストしていませんが、利用可能なすべてのデータを読み取るときに、FIFO が単に EOF ビットを設定しているのかどうか疑問に思っています。その場合、これを行うことができる場合があります。

std::ifstream fifo;
std::string   line;
bool          done = false;

/* code to open your FIFO */

while (!done)
{
    while (std::getline(fifo, line))
    {
        /* do stuff with line */
    }
    if (fifo.eof())
    {
        fifo.clear();  // Clear the EOF bit to enable further reading
    }
    else
    {
        done = true;
    }
}

FIFO の終わりを読み取った場合は、リセットして次のデータを待ちます。エラーが発生した場合は、完了です。私はこのウェブサイトからこれのアイデアを得ました。リセットを実行した同じブロックで FIFO を閉じて再度開く必要がある場合もあります。

于 2009-01-27T15:52:10.587 に答える
1

によって提供されるgetline関数は<string>、ストリームオブジェクトへの参照を返します。このオブジェクトの「良さ」をテストして、まだ開いているかどうか、またはエラーが発生したかどうかを確認できます。

std::ifstream fifo;
std::string   line;

/* code to open your FIFO */

while (std::getline(fifo, line))
{
    /* do stuff with line */
}

FIFOが閉じると、whileテストはfalseを返し、ループを終了します。すべてのループ反復は、より多くのデータが準備できるまで、スレッドを効果的に読み取りブロックします。

于 2009-01-26T17:52:54.433 に答える
0

次のようにストリームを使用します。

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);

string CmdLine;

while (std::getline(_FifoInStream, CmdLine)) {
    cout << CmdLine << endl;
}

_FifoInStream 変数を初期化するとき、つまりストリームを開くときにのみブロックされます。データを FIFO に送信した後、while ブロックを通り抜けます。私が必要とするのは、読み取り時にブロックされるたびに FIFO から無期限に読み取ることです。

于 2009-01-27T08:59:16.240 に答える