について次の質問があります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
ここにいくつかのコード:
// Compression
// -----------
filtering_ostream out;
out.push(my_compressor());
out.push(file_sink("file.out"));
// Compress the 'file.in' to 'file.out'
std::ifstream stream("file.in");
out << stream.rdbuf();
// Decompression
// -------------
filtering_istream in;
in.push(my_decompressor());
in.push(file_source("file.out"));
std::string res;
while (in) {
std::string t;
// My decompressor wants to retrieve the full block from input (say, 4096 bytes)
// but instead retrieves 150 bytes because meets '1A' char in the char sequence
// That obviously happens because file should be read as a binary one, but
// how do I state that?
std::getline(in, t); // <--------- The error happens here
res += t;
}