1

ifstreamを使用して、名前付きパイプからデータを読み取りたい。その演算子>>を使用して、フォーマットされたデータ(通常はint)を読み取りたいと思います。ただし、エラー処理の仕組みに少し混乱しています。

intを読みたいのですが、使用できるのは3バイトだけだと想像してください。エラービットが設定されますが、これらの3バイトはどうなりますか?それらは「消える」のでしょうか、後で抽出するためにストリームに戻されるのでしょうか?

ありがとう、

4

1 に答える 1

1

指摘されているように、を介してバイナリデータを読み取ることはできませんistream。ただし、使用可能なバイト数の問題については(おそらくbasic_ios<char>streambufバイナリストリームistreamostream使用する必要があるstreambufため)、実際のバイトのソーシングとシンクにはを使用します。そしてstreambuf通常はバッファ:手順は次のとおりです。バイトがバッファにある場合はそれを返します。そうでない場合は、バッファのリロードを試み、リロードが完了するか、確実に失敗するまで待機します。決定的な失敗の場合、streambuf ファイルの終わりを返し、それが入力を終了します。istreamファイルの終わりを記憶し、それ以上の入力を試みません。したがって、読み取っているタイプが4バイトを必要とする場合、それはから4バイトを要求します。streambuf、通常、これらの4バイトが存在するまで待機します。エラーは設定されません(エラーがないため)。operator>>これらの4バイトが到着するまで、から戻ることはありません。

独自のバイナリストリームを実装する場合は、同じパターンを使用することを強くお勧めします。std::ios_baseこれにより、や(おそらく)などの既存の標準コンポーネントを直接使用できるようにstd::filebufなり、他のプログラマーに使い慣れたイディオムが提供されます。ブロッキングが問題になる場合、最も簡単な解決策は、メッセージキューなどを介して通信し、別のスレッドで入力を実行することです。(Boostは非同期IOをサポートしています。これによりスレッドが回避されますが、グローバルにはるかに複雑になり、従来のストリームイディオムではうまく機能しません。)

于 2012-04-11T18:37:04.170 に答える