2

boost::iostreams を使用して「シンク」を作成したので、誰かが iostream オブジェクトに書き込もうとしたときに、基本的に自分のコードを実行できます。

残念ながら、システムのどこかにバッファがあるため、Sink の write() 関数は 4kB ごとにしか呼び出されません。私が実装しているシンクは固定サイズ (たとえば 128 バイト) であるため、これは問題です。この量のデータが書き込まれると、呼び出し元にエラー (「ディスクがいっぱいです」など) を返す必要があります。

バッファーのため、呼び出し元は数キロバイトのデータを書き込むことができ、エラーは返されません。その後、バッファーがフラッシュされると、余分なデータが静かに失われ、問題が発生します。

どういうわけかこのバッファを無効にすることが可能かどうか誰かが知っていますか? ここで一般的な iostream (pubsetbuf など) に対して多くの提案を試みましたが、Boost 実装には適用されないようです。

問題のコードは、私が取り組んでいるライブラリの一部であり、役立つ場合は GitHub から入手できます (「make check」を実行すると、この問題が原因で 1 つの失敗が表示されます)。

どんな提案でも大歓迎です!

4

1 に答える 1

0

回避策を見つけたと思います。いつフラッシュを実行するかを手動で決定する必要がありますが、シークを行うと、つまり同じ位置をシークする場合でも、stream.seekp(0, std::ios::cur)すべてが期待どおりにフラッシュされます。

これは少し恐ろしい回避策ですが、ほとんどの場合はうまくいくようです。

于 2011-04-17T03:13:21.337 に答える