0

私は C++ でハフマン エンコーディング プログラムを作成しており、この Web サイトを参照として使用しています。

http://algs4.cs.princeton.edu/55compression/Huffman.java.html

私は現在、writeTrie メソッドにいます。これが私のバージョンです。

// write bitstring-encoded tree to standard output
void writeTree(struct node *tempnode){
if(isLeaf(*tempnode)){
    tempfile << "1";
    fprintf(stderr, "writing 1 to file\n");
    tempfile << tempnode->ch;
    //tempfile.write(&tempnode->ch,1);
    return;
}
else{
    tempfile << "0";
    fprintf(stderr, "writing 0 to file\n");
    writeTree(tempnode->left);
    writeTree(tempnode->right);
}   
}

コメントされた行を見てください。たとえば、テキスト ファイルに書き込んでいるとしましょう。ただし、tempnode->ch で文字を構成するバイトを書きたいとします (これは unsigned char です)。これを行う方法について何か提案はありますか? コメント行では、unsigned char* から const char* への無効な変換エラーが発生します。

前もって感謝します!

編集:明確にするために:たとえば、最終的なテキストファイルをバイナリにしたいと思います-1と0のみ。私が提供したリンクのヘッダーを見ると、「ABRACADABRA!」の例が示されています。そして結果の圧縮。char (上記の「A」の例など) を取得し、unsigned int 番号 (A='65') を使用して、バイナリで 65 をバイトとして書き込みたいと思います。

4

1 に答える 1

3

charは1バイトと同じです。前の行tempfile << tempnode->ch;は、あなたが望んでいるように見えることをすでに正確に実行しています。

writeforのオーバーロードはありませんunsigned charが、必要に応じて実行できます

tempfile.write(reinterpret_cast< char * >( &tempnode->ch ),1);

これはかなり醜いですが、とまったく同じことをしtempfile << tempnode->chます。

編集:ああ、あなたはバイトのビットのシーケンス1と文字を書きたいです。0C ++には、そのためのあいまいなトリックがあります。

#include <bitset>

tempfile << std::bitset< 8 >( tempnode->ch );
于 2012-04-13T02:41:29.160 に答える