問題タブ [boost-iostreams]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - boost :: iostreams::zlib_compressorをフラッシュします。「同期フラッシュ」を取得するにはどうすればよいですか?
使用時に「zlib同期フラッシュ」を取得するために必要な魔法はありboost::iostreams::zlib_compressor
ますか?フィルターを呼び出すだけflush
、またはフィルターstrict_sync
をfiltering_ostream
含むものを呼び出すだけでは、ジョブは実行されません(つまり、ストリームを閉じずに、デコンプレッサーがこれまでにコンプレッサーによって消費されたすべてのバイトを回復できるように、コンプレッサーを十分にフラッシュする必要があります)。
ヘッダーを見ると、いくつかの「フラッシュコード」(特にsync_flush
)が定義されているように見えますが、それらをどのように使用するかはわかりません(コンプレッサーがに追加されていることを念頭に置いてくださいfiltering_ostream
)。
c++ - Boost iostreamマップトファイルとBoostプロセス間マップトファイルに違いはありますか?
マップされたバイナリファイルをメモリに作成したい。ただし、システムにマップするファイルを作成する方法がわかりません。ドキュメントを数回読んで、2つのマップトファイルの実装があることに気付きました。1つはiostreamにあり、もう1つはプロセス間にあります。
マップされたファイルを共有メモリに作成する方法について何か考えがありますか?マルチスレッドプログラムがバイナリファイル形式で記述された大きなdoubleの配列を読み取れるようにしようとしています。また、iostreamとinterprocessのマップされたファイルの違いは何ですか?
c++ - BOOST.IOstreams:bzip2への書き込みに問題があります
こんにちは、Boost.IOstreamsを使用してデータをbzip2ファイルに保存したいと思います。
私が間違っていることは何ですか?Boost1.42.0を使用しています。
アーマンよろしくお願いします。
編集 双方向オプションを削除すると、コードは機能します。
多分誰かが理由を説明できますか?
c# - boost::iostream の Zlib 圧縮は zlib.NET と互換性がありません
C# と C++ アプリケーションの間で圧縮されたデータを ZLIB 形式で送信したいと考えています。C++ では、boost::iostreams で利用可能な zlib_compressor/zlib_decompressor を使用します。C# では、現在 zlib.NET ライブラリで利用可能な ZOutputStream を使用しています。まず、両方のライブラリを使用して同じデータを圧縮すると、結果が異なって見えます。
- ブースト::iostreams::zlib_compressor:
63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00
- zlib.NET (zlib.ZOutputStream):
78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D
(zlib.NET には存在するが、boost には存在しない 78 9C パターンに注意してください)。
さらに、zlib.NET で圧縮したデータを boost で解凍すると、ストリームから読み取ることができず、何か問題があることが示唆されます。ブーストで圧縮されたデータを解凍しようとすると機能します。
誰が何がうまくいかないのか知っていますか?
ありがとうございました、
ヨハン
c++ - C++ ポリモーフィックでシーク可能なバイナリ I/O インターフェイスの推奨事項
私はandを C++ のランダム アクセス バイナリ I/O のポリモーフィック インターフェイスとして使用std::istream
してきましたが、多くの点で次善のようです。ostream
- streampos/streamoff の制限により、64 ビット シークは移植性がなく、エラーが発生しやすくなります。現在はboost/iostreams/positioning.hppを回避策として使用していますが、注意が必要です
- ファイルの切り捨てや拡張などの操作の欠落 (ala POSIX
ftruncate
) - 具体的な実装間の矛盾; たとえば
stringstream
、独立した get/put ポジションがありますが、そうではありfilestream
ません - プラットフォームの実装間の不一致; たとえば、ファイルの最後をパスしようとする動作や、エラーでの
failbit
/の使用badbit
stream
のすべてのフォーマット機能や、場合によってはバッファリングさえも必要ありませんstreambuf
streambuf
エラー報告 (つまり、例外とエラー インジケーターを返すこと) は、実際には実装に依存していると考えられます。
Boost.Iostreams Device conceptによって提供される簡素化されたインターフェイスが気に入っていますが、これはポリモーフィック クラスではなく、関数テンプレートとして提供されています。( device
classはありますが、ポリモーフィックではなく、提供されたデバイス実装で必ずしも使用されるとは限らない単なる実装ヘルパー クラスです。) 私は主に大きなディスク ファイルを使用していますが、別の実装を簡単に置き換えることができるように、本当にポリモーフィズムが必要です (例:単体テストstringstream
の代わりに使用します) 深いテンプレートのインスタンス化の複雑さやコンパイル時の結合はありません。fstream
これに対する標準的なアプローチの推奨事項はありますか? これはよくある状況のように思えるので、不必要に独自のインターフェイスを発明したくありません。例として、java.nio.FileChannel のようなものが理想的です。
これまでの私の最善の解決策は、Boost.Iostreams デバイスの上に薄いポリモーフィック レイヤーを配置することです。例えば:
c++ - C++ iostream に関する質問
私は今飛び込んboost::iostreams
でいて、いくつかを反復するストリームを作成する方法を探していますcontainer<char>
。
現在、 で機能するコードがありますが、std::vector<char>
でのみ機能します。特定のコードを書いたからです。std::vector
私は次のことをしています:
whereLoadImpl(...)
は次のように記述されます。
また、特定の を使用してシリアル化/逆シリアル化をラップするために使用されstream
ます。
Load
ルーチンをより一般的なものにする方法について何かアドバイスをいただけますか? たとえば、コンテナstd::vector<char>
があればそれに代わる機能が欲しいと思います。std::string
c++ - ブースト::iostreamをstd::ios :: binaryに匹敵するモードで動作させる方法は?
について次の質問がありますboost::iostreams
。誰かがフィルターの作成に精通しているなら、私は実際にあなたのアドバイス/助けをいただければ幸いです。
私は、データコンプレッサーとデコンプレッサーboost::iostream::filtering_stream
として機能するマルチ文字フィルターのペアを書いています。
私はコンプレッサーを書くことから始め、lz-familyからいくつかのアルゴリズムを選び、現在はデコンプレッサーに取り組んでいます。
一言で言えば、私のコンプレッサーはデータをパケットに分割し、パケットは別々にエンコードされてからファイルにフラッシュされます。
ファイルからデータを復元する必要がある場合(プログラミング用語では、read(byte_count)
要求を受信する)、完全にパックされたブロックを読み取り、バッファーに入れ、解凍してから、要求されたバイト数を指定する必要があります。このロジックを実装しましたが、現在、次の問題に苦しんでいます。
データがパックされると、出力ファイルに任意のシンボルが表示される可能性があります。(hex 1A, char 26)
また、。を使用した記号を含むファイルを読み取るときに問題が発生しますboost::iostreams::read(...., size)
。
std::ifstream
たとえば、を使用している場合は、std::ios::binary
モードを設定すると、この記号を簡単に読み取ることができます。
ルーチンをboost::iostream
使用してcharシーケンスを読み取るフィルターを実装するときに同じことを実現する方法はありますか?boost::iostream::read
ここにいくつかのコード:
c++ - boost::iostreams::copy() からの例外
以下のコードでは、EOF を超えた文字が壊れた "hello.bz2" があります。
boost::iostreams::copy() 呼び出しを throw にする方法はありますか?
編集: これまでのところ最も注目されている行は無視してください。EOF。破損した bzip2 ファイルで作業することを想定してください。ファイルに対してbzcatを実行したときに発生したエラーを示唆する「EOF」を使用しました
c++ - boost::iostreams::zlib::default_noheader が無視されているようです
boost::iostreams の zlib フィルターで gzip ヘッダーを無視するのに問題があります... zlib_param の default_noheader を true に設定してから zlib_decompressor() を呼び出すと、「data_error」エラー (ヘッダー チェックが正しくない) が発生するようです。これは、zlib がまだヘッダーを見つけることを期待していることを示しています。ヘッダーなしでデータを解凍するために boost::iostreams::zlib を入手した人はいますか? 2 バイトのヘッダーを持たないファイル/ストリームを読み取って解凍できる必要があります。どんな援助でも大歓迎です。
これは、boost::iostreams::zlib ドキュメントで提供されているサンプル プログラムの修正版です。
テスト データに問題がないことはわかっています。テストファイルで gzread() を呼び出す小さなプログラムを作成しました。正常に解凍されました...なぜこれが機能しないのか混乱しています。
前もって感謝します。
-氷
c++ - boost::iostreams シンクでバッファを無効にするにはどうすればよいですか?
boost::iostreams を使用して「シンク」を作成したので、誰かが iostream オブジェクトに書き込もうとしたときに、基本的に自分のコードを実行できます。
残念ながら、システムのどこかにバッファがあるため、Sink の write() 関数は 4kB ごとにしか呼び出されません。私が実装しているシンクは固定サイズ (たとえば 128 バイト) であるため、これは問題です。この量のデータが書き込まれると、呼び出し元にエラー (「ディスクがいっぱいです」など) を返す必要があります。
バッファーのため、呼び出し元は数キロバイトのデータを書き込むことができ、エラーは返されません。その後、バッファーがフラッシュされると、余分なデータが静かに失われ、問題が発生します。
どういうわけかこのバッファを無効にすることが可能かどうか誰かが知っていますか? ここで一般的な iostream (pubsetbuf など) に対して多くの提案を試みましたが、Boost 実装には適用されないようです。
問題のコードは、私が取り組んでいるライブラリの一部であり、役立つ場合は GitHub から入手できます (「make check」を実行すると、この問題が原因で 1 つの失敗が表示されます)。
どんな提案でも大歓迎です!