我正在处理霍夫曼编码,我用
构建了字符频率表std::map<char,int> frequencyTable;
然后我构建了Huffman树,然后以这种方式构建了代码表:
std::map<char,std::vector<bool> > codes;
现在我将逐个字符地读取输入文件,并通过代码表对它们进行编码,但我不知道如何将写入位写入二进制输出文件。 有什么建议吗?
更新: 现在我正在尝试这些功能:
void Encoder::makeFile()
{
char c,ch;
unsigned char ch2;
while(inFile.get(c))
{
ch=c;
//send the Huffman string to output file bit by bit
for(unsigned int i=0;i < codes[ch].size();++i)
{
if(codes[ch].at(i)==false){
ch2=0;
}else{
ch2=1;
}
encode(ch2, outFile);
}
}
ch2=2; // send EOF
encode(ch2, outFile);
inFile.close();
outFile.close();
}
和此:
void Encoder::encode(unsigned char i, std::ofstream & outFile)
{
int bit_pos=0; //0 to 7 (left to right) on the byte block
unsigned char c; //byte block to write
if(i<2) //if not EOF
{
if(i==1)
c |= (i<<(7-bit_pos)); //add a 1 to the byte
else //i==0
c=c & static_cast<unsigned char>(255-(1<<(7-bit_pos))); //add a 0
++bit_pos;
bit_pos%=8;
if(bit_pos==0)
{
outFile.put(c);
c='\0';
}
}
else
{
outFile.put(c);
}
}
但是,我不知道为什么,它不起作用,循环永远不会执行,编码功能从未使用过,为什么?
答案 0 :(得分:3)
您无法直接将单个位写入文件。读/写的I / O单元是一个字节(8位)。因此,您需要将bool打包成8位的块,然后写入字节。例如,请参阅Writing files in bit form to a file in C或How to write single bits to a file in C。
答案 1 :(得分:0)