如何用c ++编写二进制文件

HSN*_*HSN 5 c++ binary encoding huffman-code

我正在尝试用c ++实现Huffman的编码算法.

我的问题是:在我得到每个字符的等效二进制字符串后,如何将这些0和1作为二进制写入文件而不是字符串0或字符串1?

提前致谢 ...

Bar*_*icz 0

您无法写入仅包含位的二进制文件;写入的数据的最小大小是一个字节(即 8 位)。

所以你应该做的是创建一个缓冲区(任何大小)。

char BitBuffer;
Run Code Online (Sandbox Code Playgroud)

写入缓冲区:

int Location;
bool Value;

if (Value)
    BitBuffer |= (1 << Location);
else
    BitBuffer &= ~(1 << Location)
Run Code Online (Sandbox Code Playgroud)

该代码(1 << Location)生成一个除 指定的位置外全为 0 的数字Location。然后,如果Value设置为 true,则将 Buffer 中的相应位设置为 1,否则设置为 0。使用的二进制操作相当简单,如果你不理解它们,任何好的 C++ 书籍/教程中都应该有。

位置应为 <0, sizeof(Buffer)-1> 范围内的数字,因此在本例中为 <0,7>。

使用 fstream 将缓冲区写入文件相对简单。只需记住将其作为二进制文件打开即可。

ofstream File;
File.open("file.txt", ios::out | ios::binary);
File.write(BitBuffer, sizeof(char))
Run Code Online (Sandbox Code Playgroud)

编辑:注意到一个错误并修复它。

EDIT2:你不能<<在二进制模式下使用运算符,我忘记了。

替代解决方案:使用std::vector<bool>std::bitset作为缓冲区。

这应该更简单,但我想我可以帮助你更多一点。

void WriteData (std::vector<bool> const& data, std::ofstream& str)
{
    char Buffer;
    for (unsigned int i = 0; i < data.size(); ++i)
    {
       if (i % 8 == 0 && i != 0)
           str.write(Buffer, 1);
       else
           // Paste buffer setting code here
           // Location = i/8;
           // Value = data[i];
    }
    // It might happen that data.size() % 8 != 0. You should fill the buffer
    // with trailing zeros and write it individually.
}
Run Code Online (Sandbox Code Playgroud)