【发布时间】:2012-06-28 21:24:03
【问题描述】:
我正在使用霍夫曼算法开发文件压缩器,现在我面临一个问题:
通过对单词使用算法: stackoverflow,我得到以下结果:
a,c,e,f,k,l,r,s,t,v,w = 1 time repeated
o = 2 times repeated
a,c,e,f,k,l,r,s,t,v,w = 7.69231%
and
o = 15.3846%
所以我开始将 then 插入二叉树,这将得到结果:
o=00
a=010
e=0110
c=0111
t=1000
s=1001
w=1010
v=1011
k=1100
f=1101
r=1110
l=1111
表示角色在树中的路径,0为左,1为右。
那么“stackoverflow”这个词将是: 100110000100111010011111000010110110111011011111001010
好吧,我想将整个值放入二进制文件中,以位为单位,这将导致 47 位,恰好是 6 字节,但我只能将其设为 47 字节,因为放入的最小值fwrite 或 fprintf 文件为 1byte,使用 sizeof(something)。
我的问题是:我怎样才能在我的文件中只打印一个位?
【问题讨论】:
-
文件大小以字节为单位,而不是位。您需要找到一种方法将额外的位打包成一个字节。
-
我也试过了,考虑到我会在序列中打包最多 8 位以使其成为一个字节,但是我怎样才能表示我的文件正在结束呢?如果我实际上不需要使用 8 位,假设它是单词 test,即 101001,它不会完成一个字节,如果我用 00 填充其他 2 位将代表另一个字符阅读它们,x-x
-
即使您使用位运算符编写文件,读回文件也将非常困难,因为所有位都会在一起。
-
不幸的是,大多数系统上的文件大小以字节为单位。所以你需要一种方法来填充文件的末尾。不幸的是,用零填充会导致 stackoverflowo。您是添加新的
符号还是以长度开头。 (长度只需 3 位)因为您可以从文件长度中获取字节数,哦,000 将是 8)。不要担心比特的腰部。操作系统通常以 512 字节或更大的块分配磁盘空间,尽管有时更小。需要更大的开销,就好像你不知道这个词是stackoverflow,就不能知道你正在使用的字母表。
标签: c++ file huffman-code