写位到文件?

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”文件?(不是字符串)

Mar*_*ica 5

答:不能。

可以写入文件(或从文件读取)的最小数量是charunsigned 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)