首页 运用哈夫曼编码压缩解压文件源代码

运用哈夫曼编码压缩解压文件源代码

举报
开通vip

运用哈夫曼编码压缩解压文件源代码运用哈夫曼编码压缩解压文件源代码 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];          //存放哈夫曼编码的数...

运用哈夫曼编码压缩解压文件源代码
运用哈夫曼编码压缩解压文件源代码 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
本文档为【运用哈夫曼编码压缩解压文件源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_359508
暂无简介~
格式:doc
大小:84KB
软件:Word
页数:10
分类:互联网
上传时间:2013-04-04
浏览量:102