2

解決策をたくさん探した後、私は実際に助けを求めることにしました!

いくつかのブロックで構成されるファイルがあり、各ブロックは圧縮されている場合とされていない場合があります。各ブロックの前には、ブロックのサイズとブロックが圧縮されているかどうかが示されます。各ブロック内には、ブロックを識別する文字列があります。ブロック名を指定して、ファイルから関連するブロックを取得したいと思います。

私の最初の考えは、圧縮フラグとブロックのサイズを読み取り、ブロックだけをistringstreamに読み取り、必要に応じてistringstreamを解凍してから、ブロック名を検索することです。圧縮フラグとブロックのサイズを読み取ることはできますが、ファイルデータのブロックをistringstreamに読み込む方法がわかりません。人々がファイル全体をistringstreamに読み込んだ場所はわかりますが、各ブロックを解凍する必要がある場合とない場合があるため、これは行いたくありません。

私が見逃したアイデアや解決策へのリンクはありますか?または、より良いアルゴリズムはありますか?コメントありがとうございます。

4

5 に答える 5

2

データをメモリ ストリームに読み込む必要がある理由。それを配列またはに読み込まないのはなぜstd::vectorですか?

于 2009-12-09T20:40:49.160 に答える
0

C スタイルの文字列を使用する解凍ルーチンのため、ストリームを好みます。

しかし、圧縮/解凍ルーチンで必要なものに std::vector をキャストできるはずなので、読み取り部分が機能するようになったら調べます。

これらすべてに対する別のコンポーネントは、ブロックから有用なデータを引き出すことです。私は実際には istringstream からの読み取りについてあまり詳しく調べていないので、それがどうなるかによって、おそらく istringstream からのプロセスの std::vector から処理したいという私の欲求を決定づけるでしょう。

お二人のおかげです。Bjarneがpubsetbufについて言っていることを解釈する必要があるようです:)。

于 2009-12-09T22:46:15.937 に答える
0

テストされていませんが、次のようなものが機能するはずです。

// open file, and seek to the appropriate position
// read 'length', the size of your chunk in bytes
std::vector<char> buffer(length);
file.read(&buffer[0],length);
file.close();
// decompress or manipulate the buffer as needed
std::istringstream iss;
iss.rdbuf()->pubsetbuf(&buffer[0],length); // here's the magic
于 2009-12-09T20:39:55.057 に答える
0

イテレータを使用します。

my_fstream >> compressed_size;
stringstream compressed_data;
istream_iterator<char> file_fetch_iter( my_fstream );
ostream_iterator<char> buffer_put_iter( compressed_data );

for ( size_t i = 0; i < compressed_size; ++ i ) {
    * buffer_put_iter ++ = * file_fetch_iter ++;
}

legacy_decompressor( compressed_data );
于 2009-12-23T07:53:22.977 に答える
0

ストリームは、その名前が示すように、ストリーミングされたテキストまたはバイナリ処理を目的としています。あなたはブロックの読み取りに興味があるので、データを文字列ストリームに入れることはあまり意味がありません。

洗練されたアプローチは、std::streambuf などをベースとして使用して、独自のストリームを実装することです。次に、圧縮を処理するかどうかに関係なく、入力でブロックを読み取ってバッファリングし、出力でデータのストリームを取得します。出力では、通常の演算子を使用してデータを文字列や整数などに適切に読み取ることができます。

そうしないと、データをバッファに読み込むためのシステム コールと同じように、ストリーム読み取りメソッドを使用することになります。この場合、データをベクターに読み込み、追加の文字列ストリームを使用して速度を落とさないようにすることをお勧めします。

gzstream など、独自のストリーム クラスをネット上で実装する例を見つけることができます。本 Standard C++ Iostreams and Locales book も役に立ちます。

于 2009-12-23T08:18:57.830 に答える