Mur*_*rat 0 c++ binary ofstream huffman-code
我正在尝试实现霍夫曼树。
我想做一个简单测试的简单.txt文件的内容:
aaaaabbbbccd
Run Code Online (Sandbox Code Playgroud)
字符频率:a:5,b:4,c:2,d:1
代码表:(1 s和0 s的数据类型:字符串)
a:0
d:100
c:101
b:11
Run Code Online (Sandbox Code Playgroud)
我想写为二进制的结果:(22位)
0000011111111101101100
Run Code Online (Sandbox Code Playgroud)
如何将结果的每个字符作为二进制逐位写入“ .dat”文件?(不是字符串)
答:不能。
可以写入文件(或从文件读取)的最小数量是char或unsigned char。出于所有实际目的,char恰好具有八个位。
您将需要有一个char缓冲区,以及其持有的位数。当该数字达到8时,您需要将其写出,并将计数重置为0。您还需要一种在末尾刷新缓冲区的方法。(并不是说您不能向文件中写入22位-您只能写入16或24。您将需要某种方式来标记末尾的哪些位未使用。)
就像是:
struct BitBuffer {
FILE* file; // Initialization skipped.
unsigned char buffer = 0;
unsigned count = 0;
void outputBit(unsigned char bit) {
buffer <<= 1; // Make room for next bit.
if (bit) buffer |= 1; // Set if necessary.
count++; // Remember we have added a bit.
if (count == 8) {
fwrite(&buffer, sizeof(buffer), 1, file); // Error handling elided.
buffer = 0;
count = 0;
}
}
};
Run Code Online (Sandbox Code Playgroud)