将位写入C++文件

4

我正在进行哈夫曼编码的工作,已经构建出字符频率表。

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);
}
}

但是,我不知道为什么,它不起作用,循环从未执行过,编码函数也从未被使用,为什么呢?


2
由于只有256个可能的字符值,请考虑创建一个256个元素的数组,而不是使用char作为键的映射。如果只使用了少量可能的字符,则这可能会使用额外的内存,但比映射查找快得多。 - Neil Kirk
这是一个学校项目,我的主要目标是让程序运行起来,因为很不幸,我剩下的时间很少。 - Alfredo Liardo
2个回答

5

0
C++ 标准流支持对底层 CPU 支持的最小单位进行访问,即字节。
在 C++ 中有一些实现了位流类的方式,比如 Stanford Bitstream Class
另一种方法可以使用 std::bitset 类。

std::vector<bool> 不是更容易吗? - didierc
C++中的bool不是一个位。 - Jean-Baptiste Yunès
@Jean-BaptisteYunès 这很有趣。它是如何实现的或者有任何参考资料吗? - Abhinav Gauniyal
需要查看标准,但通常是一个 int - Jean-Baptiste Yunès
3.9.1/7 类型 bool、char、char16_t、char32_t、wchar_t 以及有符号和无符号整数类型被统称为整数类型。整数类型的同义词是整型。 - Jean-Baptiste Yunès
std::bitset - 这个类模拟了一个bool元素的数组。 - Risinek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接