0

ハフマンコーディングの宿題に取り組んでいます。ハフマン アルゴリズムは既に完成していますが、バイナリ ファイルで動作するように少し変更する必要があります。関連する問題を読むのに時間を費やしましたが、おそらくデータ型とバイナリ ファイルの理解が不足しているため、まだ少し苦労しているので、以前の質問を繰り返さないことを願っています (関連するコードは投稿しません)プログラムのハフマン部分に)。

キー フレーズは次のとおりです。「コードワードにマップされる各シンボルは 4 バイトのバイナリ文字列であると想定できます。」そして、私が知っていると思うのは、Char は 1 バイトを表し、unsigned int は 4 バイトを表すということです。 、そのため、一度に入力 4 バイトを unsigned int バッファーに読み取ってから、プログラムのハフマン部分のデータを収集する必要があると推測しています。

int main() {
    unsigned int buffer;
    fstream input;
    input.open("test.txt", ios::in | ios::binary);


    while(input) {
        input.read(reinterpret_cast<char *>(&buffer), 4);
        //if buffer does not exist as unique symbol in collection of data add it
        //if buffer exists update statistics of symbol
    }
    input.close();
}

これはデータを処理する良い方法のように見えますか? 1、2、または 3 バイトしか残っていない場合、ファイルの最後をどのように処理すればよいですか? そのため、バッファを unsigned int として構造体に格納しています。好奇心から、バッファを文字列に再キャストするにはどうすればよいですか?
編集:ハフマン圧縮ファイルのヘッダーを保存する最良の方法は何ですか?

4

1 に答える 1

1

これはデータを処理する良い方法のように見えますか?

ポインターをキャストする代わりに、 of を使用unionintて配列にchar [4]ポインターを渡すことをお勧めしcharます。ロジックの残りの部分がわからないので、実際の処理 (投稿したコードにはありません) が適切に行われているかどうかはわかりませんが、私にはかなり些細なことのように思えます。

1、2、または 3 バイトしか残っていない場合、ファイルの最後をどのように処理すればよいですか?

各シンボルの長さが 4 バイトであると仮定すると、有効な入力ではないことが予想されます。

そのため、バッファを unsigned int として構造体に格納しています。好奇心から、バッファを文字列に再キャストするにはどうすればよいですか?

どうしてそうするか?データでは、「文字」は 4 バイトです。ただし、必要に応じてバイト配列へのキャストを使用することもできます (順序が重要な場合は、ビットごとの操作を使用して実際のバイトを抽出することをお勧めします)。

于 2011-05-29T07:14:56.690 に答える