ifstreamを使用して、名前付きパイプからデータを読み取りたい。その演算子>>を使用して、フォーマットされたデータ(通常はint)を読み取りたいと思います。ただし、エラー処理の仕組みに少し混乱しています。
intを読みたいのですが、使用できるのは3バイトだけだと想像してください。エラービットが設定されますが、これらの3バイトはどうなりますか?それらは「消える」のでしょうか、後で抽出するためにストリームに戻されるのでしょうか?
ありがとう、
指摘されているように、を介してバイナリデータを読み取ることはできませんistream
。ただし、使用可能なバイト数の問題については(おそらくbasic_ios<char>
、streambuf
バイナリストリームistream
をostream
使用する必要があるstreambuf
ため)、実際のバイトのソーシングとシンクにはを使用します。そしてstreambuf
通常はバッファ:手順は次のとおりです。バイトがバッファにある場合はそれを返します。そうでない場合は、バッファのリロードを試み、リロードが完了するか、確実に失敗するまで待機します。決定的な失敗の場合、streambuf
ファイルの終わりを返し、それが入力を終了します。istream
ファイルの終わりを記憶し、それ以上の入力を試みません。したがって、読み取っているタイプが4バイトを必要とする場合、それはから4バイトを要求します。streambuf
、通常、これらの4バイトが存在するまで待機します。エラーは設定されません(エラーがないため)。operator>>
これらの4バイトが到着するまで、から戻ることはありません。
独自のバイナリストリームを実装する場合は、同じパターンを使用することを強くお勧めします。std::ios_base
これにより、や(おそらく)などの既存の標準コンポーネントを直接使用できるようにstd::filebuf
なり、他のプログラマーに使い慣れたイディオムが提供されます。ブロッキングが問題になる場合、最も簡単な解決策は、メッセージキューなどを介して通信し、別のスレッドで入力を実行することです。(Boostは非同期IOをサポートしています。これによりスレッドが回避されますが、グローバルにはるかに複雑になり、従来のストリームイディオムではうまく機能しません。)