运用哈夫曼编码压缩解压文件源代码
2010-06-22 11:25
#include
#include
#include
#include
#include
using namespace std;
struct head
{
unsigned char b; //记录字符
long count; //权重
int parent,lch,rch; //定义双亲,左孩子,右孩子
char bits[256]; //存放哈夫曼编码的数组
}
header[512],tmp; //头部一要定设置至少512个,因为结点最多可达256,所有结点数最多可达511
unsigned char ctoa(char a[]) /*将数组的前八位转成二进制形式比特位*/
{
unsigned char c=0;
for(int i=0;i<8;i++)
if(a[i]!=0)
{
c=c+(int)(a[i]-'0')*pow(2,8-1-i);
}
return c;
}
char *code(unsigned char temp,int leafnum) //寻找对应字符的编码串,并返回
{
for(int i=0;i
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
点
unsigned char temp; //定义unsigned char类型,暂存文件中字符的中间变量
/*********************************文件中字符频度************************************/
for(int i=0;i<256;i++)
{
header[i].count=0; //初始化权重
header[i].b=(unsigned char)i; //初始化字符
}
ifstream infile(infilename,ios::in|ios::binary);
while(infile.peek()!=EOF)
{
infile.read((char *)&temp,sizeof(unsigned char)); //读入一个字符
header[temp].count++; //统计对应结点字符权重
flength++; //统计文件长度
}
infile.close(); //关闭文件
for(i=0;i<256-1;i++) //对结点进行冒泡排序,权重大的放在上面,编码时效率高
for(int j=0;j<256-1-i;j++)
if(header[j].count=8) //当buf中字符长度大于8时,一直处理写入,直至小于8
{
temp=ctoa(buf); //上面临时变量已经完成使命,可以赋新值了
outfile.write((char *)&temp,sizeof(unsigned char)); //转成二进制写入
clength++; //统计代码结尾偏移加1,用于找到叶子结点位置
strcpy(buf,buf+8); //字符串前移八位
} //当此循环结束时,表示buf[]中已经小于8了,没到文件末尾,读下一个,继续,否则退出
} //while 此层循环退出时,表示已到末尾,再判断buf中是否写完,没写完,连满至少8个字符,再写一个字节,就够了
if(strlen(buf)>0)
{
strcat(buf,"0000000");
temp=ctoa(buf); //前八位转成二进制形式
outfile.write((char *)&temp,sizeof(unsigned char));
clength++; //统计代码结尾偏移加1,用于找到叶子结点位置
}
outfile.seekp(4);
outfile.write((char *)&clength,sizeof(long)); //写入文件中将记录叶子结点位置
infile.close();
/*************************************将字符编码对照表写入文件****************************************/
long bytelen; //记录编码以二进制存储时需要占多少个字节
outfile.clear();
outfile.seekp(clength); //将文件指针移到编码后面的第一位置,在此处记录叶子结点数
outfile.write((char *)&leafnum,sizeof(long)); //写入叶子结点数
for(i=0;i0)
{
code[n--]=c%2+'0';
c=c/2;
}
}
int strcmp1(char buf[],struct head head[],int n,unsigned char &c) //将buf字符串与header[i].bits[]中匹配,成功后对应的字符由c带回
{
for(int i=0;iheader[j+1].count)
{
tmp=header[j];
header[j]=header[j+1];
header[j+1]=tmp;
}
}
}
/************************************将编码读入内容,进行解码工作************************************/
readlen=0;
writelen=0;
ofstream outfile(outfilename,ios::binary|ios::out); //打开编码后文件
if(!outfile)
{
cerr<<"输出文件打开失败"<=256) //处理缓冲区,直到少于256位,再读满它
{
for(i=0;i=flength) break; //如果写入达到原文件长度,退出
}//while
if(readlen>=(clength-8)/*编码长度*/||writelen>=flength) break; //如果写入或者读入编码完毕,退出
}//退出此循环后,还有未解码完成的buf[]
//对buf[]缓冲的善后处理
while(writelen
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
:"<3)
{
strcpy(select,cmdline[1]);
strcpy(infilename,cmdline[2]);
strcpy(outfilename,cmdline[3]);
}
else if(num==1)
{
cout<<"输入选项[压缩yasuo/解压jieya]:";cin>>select;
cout<<"[源文件]:";cin>>infilename;
cout<<"[目标文件]:";cin>>outfilename;
}
if(!strcmp(select,"/yasuo"))
compress(infilename,outfilename);
else if(!strcmp(select,"/jieya"))
uncompress(infilename,outfilename);
else help();
return 0;
}
类别:数据结构 |
| 添加到搜藏 | 分享到i贴吧 | 浏览(170) | 评论 (0)
上一篇:c++的文件流中的eof()问题
最近读者:
☆失忆の翅膀★
花开花败2010
lhychao
okfrankok
lostIP
我围剿
125516639