0

我正在用 C++ 编写一个霍夫曼编码程序,并使用这个网站作为参考:

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 写入构成 char 的字节(这是一个无符号字符,顺便说一句)。有关如何执行此操作的任何建议?注释的行给出了从 unsigned char* 到 const char* 的无效转换错误。

提前致谢!

编辑:澄清一下:例如,我希望我的最终文本文件是二进制文件——只有 1 和 0。如果您查看我提供的链接的标题,他们会给出“ABRACADABRA!”的示例。以及由此产生的压缩。我想取字符(例如上面的示例中的'A'),使用它的无符号整数(A='65'),并以二进制形式写入 65,作为一个字节。

4

1 回答 1

3

char 等同于字节。前面的行tempfile << tempnode->ch;已经完全符合您的要求。

writefor没有重载unsigned char,但如果你愿意,你可以做

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

这相当丑陋,但它的作用与tempfile << tempnode->ch.

编辑:哦,你想为字节中的位写一系列10字符。C++ 有一个晦涩的技巧:

#include <bitset>

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