《c++哈夫曼树的文件压缩解压程序全部代码及设计报告.pdf》由会员分享,可在线阅读,更多相关《c++哈夫曼树的文件压缩解压程序全部代码及设计报告.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#include#include#include /队列容器using namespace std;const int leaf=256;/最多可能出现的不同字符数const long MAX=99999999;/表示无穷大typedef struct HTnodelong weight;/记录结点的权值int parent;/记录结点的双亲结点位置int lchild;/结点的左孩子int rchild;/结点的右孩子int*code;/记录该结点的 huffman 编码int codelen;/记录该结点 huffman 编码的长度HTnode()weight=MAX;parent=-1;
2、lchild=-1;rchild=-1;codelen=0;HTnode;class huffmanTreepublic:huffmanTree();virtual huffmanTree();bool count(char*input);/统计各字符出现的次数,将其写入对应结点的权值void create();/构造 huffman 树void code();/计算每个字符的 huffman 编码void addbit(int bit);/压缩时对一个未满 8 个 bit 的 byte 中加入一个 bitvoid resetbyte();/将 byte 清空bool compress(cha
3、r*input,char*output);/压缩函数 成功执行返回 true 失败 falsebool decompress(char*input,char*output);/解压函数 成功执行返回 true失败 falsevoid compare(char*input,char*output);/将原文件与压缩后的文件比较private:int root;/记录根结点的位置int leafnum;/记录不同字符的个数HTnode HTleaf*2-1;点个数不会超过 leaf*2-1char byte;int bitsnum;int lacknum;huffmanTree:huffmanTr
4、ee()/HTnode 结构的数组,用来表示 huffman 树,树的最大结/压缩文件时用来缓冲 bit 的变量/byte 中 bit 的个数/压缩到最后 byte 中的 bit 不满 8 个时填充的 0 的个数/初始化成员变量root=0;leafnum=0;byte=0;bitsnum=0;lacknum=0;huffmanTree:huffmanTree()for(int i=0;ileaf;i+)if(HTi.codelen!=0)delete HTi.code;/统计各字符出现的次数bool huffmanTree:count(char*input)ifstream ifs;char
5、 c;ifs.open(input,ios:binary);if(!ifs)cout 无法打开文件 input !endl;return false;while(ifs.get(c)if(HTc+128.weight=MAX)/若该字符是第一次出现,先初始化权值HTc+128.weight=0;leafnum+;HTc+128.weight+;/权值+1ifs.close();return true;/选权值最小的两棵树组成新的数void huffmanTree:create()for(int i=leaf;i2*leaf-1;i+)int loc1=-1,loc2=-1;for(int j=
6、0;ji;j+)if(HTj.parent!=-1)continue;if(loc1=-1|HTj.weight HTloc1.weight)loc2=loc1;loc1=j;else if(loc2=-1|HTj.weight loc2?loc2:loc1;HTi.rchild=loc1loc2?loc1:loc2;HTloc1.parent=i;HTloc2.parent=i;root=i;/计算每个字符的 huffman 编码void huffmanTree:code()for(int i=0;i=0;j-)/从后往前找,记录结点的huffman 编码if(loc=HTHTloc.par
7、ent.lchild)HTi.codej=0;elseHTi.codej=1;loc=HTloc.parent;/压缩时对一个未满 8 个 bit 的 byte 中加入一个 bitvoid huffmanTree:addbit(int bit)if(bit=0)byte=byte 1;/若新增的 bit 为 0,则直接将 byte 按位左移elsebyte=(byte 1)|1);/若新增的 bit 为 1,先将 byte 按位左移,再与 1 按位或运算bitsnum+;/将 byte 清空void huffmanTree:resetbyte()byte=0;bitsnum=0;/压缩函数 成
8、功执行返回 true 失败 falsebool huffmanTree:compress(char*input,char*output)if(!count(input)return false;create();code();ifstream ifs;ofstream ofs;ifs.open(input,ios:binary);ofs.open(output,ios:binary);char c;if(!ifs)cout 无法打开文件 input !endl;return false;if(!ofs)cout 无法打开文件 output !endl;return false;ofs.put(
9、0);/预留一个字符,等压缩完后在该位置写入不足一个byte 的 bit 个数ofs.put(root-384);/将根节点的位置-384 写入(为使该值不超过char 的最大表示范围)for(int i=0;ileaf*2-1;i+)/写入每个结点的双亲结点位置if(HTi.parent=-1)/若该节点没有双亲结点,则写入 127(一个字节所能表示的最大ofs.put(127);值)else/否则将双亲结点的位置-384 再写入(为使该值不超过char 的最大表示范围)ofs.put(HTi.parent-384);while(ifs.get(c)/将字符的 huffman 编码并加入 b
10、yte 中int tmp=c+128;for(int i=0;iHTtmp.codelen;i+)addbit(HTtmp.codei);if(bitsnum=8)/若 byte 已满 8 位,则输出该 byte 并将 byte 清空ofs.put(byte);resetbyte();if(bitsnum!=0)/处理最后未满 8 个字符的 byte,用 0 填充并记录填充的个数for(int i=bitsnum;i8;i+)addbit(0);lacknum+;ofs.put(byte);resetbyte();ofs.seekp(0,ios:beg);ofs.put(lacknum);if
11、s.close();ofs.close();return true;/将写指针移动到文件开头/写入最后一个字节缺失的bit 个数/解压函数 成功执行返回 true 失败 falsebool huffmanTree:decompress(char*input,char*output)queue q;char c;ifstream ifs;ofstream ofs;ifs.open(input,ios:binary);ofs.open(output,ios:binary);if(!ifs)cout 无法打开文件 input !endl;return true;if(!ofs)cout 无法打开文件
12、 output !endl;return false;ifs.get(c);lacknum=c;/读出最后一个字节缺失的bit 个数ifs.get(c);root=c+384;/读出根结点的位置for(int i=0;i1)/还未到最后一个字节c=q.front();for(int i=0;i8;i+)if(int(c&128)=0)point=HTpoint.lchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)ofs.put(char(point-128);point=root;c=c 1;elsepoint=HTpoint.rchild;if(HTp
13、oint.lchild=-1&HTpoint.rchild=-1)ofs.put(char(point-128);point=root;c=c 1;q.pop();c=q.front();/最后一个字节for(i=0;i8-lacknum;i+)if(int(c&128)=0)point=HTpoint.lchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)ofs.put(char(point-128);point=root;c=c 1;elsepoint=HTpoint.rchild;if(HTpoint.lchild=-1&HTpoint.rchild
14、=-1)ofs.put(char(point-128);point=root;c=c 1;q.pop();ifs.close();ofs.close();return true;/将原文件与压缩后的文件比较void huffmanTree:compare(char*input,char*output)ifstream origin,compress;origin.open(input,ios:binary);compress.open(output,ios:binary);if(!origin)cout 无法打开文件 input !endl;return;if(!compress)cout 无
15、法打开文件 output !endl;return;double total1=0,total2=0;char c;while(origin.get(c)total1+;while(compress.get(c)total2+;cout 原文件大小:total1 Byte endl;cout 压缩后大小:total2 Byte endl;cout 压缩率:total2/total1*100%endl;origin.close();compress.close();void main()int choice=1;char input255,output255;huffmanTree h;whil
16、e(choice)cout*endl;coutcoutcoutcoutcoutcoutcoutcout*基于哈夫曼树的文件压缩/解压程序*endl;*endl;*1)压缩*endl;*endl;*2)解压*endl;*endl;*0)退出*endl;*endl;cout*说明:请输入相应的操作序号*endl;cout*endl;cout choice;switch(choice)case 1:cout input;cout output;if(press(input,output)pare(input,output);cout文件压缩成功!endl;elsecout文件压缩失败!endl;br
17、eak;case 2:cout input;cout output;if(h.decompress(input,output)cout文件解压成功!endl;elsecout文件解压失败!endl;break;case 0:break;default:cout 参数错误!请重新输入 endl;cout endl;韶关学院计算机科学学院数据结构课程设计题题目:基于哈夫曼树的文件压缩目:基于哈夫曼树的文件压缩/解压程序解压程序学生姓名:曹键明学生姓名:曹键明学学号:号:1111501101811115011018专专业:计算机科学与技术业:计算机科学与技术班班级:级:1111 级(级(1 1)班)
18、班指导教师姓名及职称:陈正铭指导教师姓名及职称:陈正铭讲师讲师起止时间:起止时间:2013 年 3 月 2013 年 4 月1 1 需求分析需求分析1.1 课题背景及意义近年来,随着计算机技术的发展,多媒体计算机技术、计算机网络技术以及现代多媒体通信技术正在向着信息化、高速化、智能化迅速发展。各个领域的应用与发展,各个系统的数据量越来越大,给数据的存储、传输以及有效、快速获取信息带来了严重的障碍。数据压缩技术能够比较有效地解决这个问题。还有在最近几年中兴起的物联网和云计算都是对海量的数据进行处理和传输的,如果不对数据进行压缩,那么数据传输所需的带宽要求就很高,物理成本上也随之上升。所以说数据压
19、缩在计算机通信中占有很重要的位置,且涉及领域多,应用广泛,与我们的生活息息相关。1.2 课题要求1.2.1实现一个基于哈夫曼树的文件压缩程序和文件解压程序。1.2.2.压缩程序能输入源文件进行压缩,输出压缩文件;1.2.3解压程序读入压缩文件,根据相应的哈夫曼编码解压还原,得到对应的源文件。1.2.4可选做:求出压缩率;打印哈夫曼树;对文件夹压缩;图形图形化窗口操作界面。1.3 任务和要求1.3.1 选择 1 时:输入一个待压缩的文本文件名称(可带路径)。如:D:1XXX.txt压缩文件名称=D:1YYY.txt1.3.2 选择 2 时:输入一个待解压的压缩文件名称(可带路径)。如:D:1YY
20、Y.txt解压文件名称=D:XXX.txt2 2 概要设计概要设计2.1 问题解决的思路概述统计字符,得出统计出字符的权值n生成哈夫曼树建立哈夫曼树根据哈夫曼树编码对编码进行压缩根据哈夫曼树解码对二进制文件进行解码生成二进制文件生成对应文件图 1 主程序流程图2.2 算法思想:2.2.1 输入要压缩的文件首先运行的时候,用户主界面上有菜单提示该如何使用软件,根据菜单提示选择所要执行的项,依次进行,因为各个环节之间有先后顺序。第一步为输入压缩软件的名称,由键盘输入文件路径和文件名称,读入字符数组中,打开该文件,按照提示进行压缩。若打不开,则继续输入。2.2.2 读文件并计算字符频率文件将信息存放
21、在字符数组中;计算每个字符出现的次数,申请一个结构体数组空间,用读取的字符减去字符结束符作为下标记录字符的频率。2.2.3 根据字符的频率,利用 Huffman 编码思想创建 Huffman 树将所记录的字符的频率作为权值来创建 Huffman 树,依次选择权值最小的两个字符作为左右孩子,其和作为父结点的权值,依次进行下去,直到所有的字符结点都成为叶子结点。2.2.4 由创建的 Huffman 树来决定字符对应的编码,进行文件的压缩根据创建的 Huffman 树来确定个字符的 01 编码,左孩子为 0,右孩子为1。读取文件,依次将每个字符用他们的编码表示,即完成一次编码。2.2.5 解码压缩即
22、根据 Huffman 树进行译码读取编码文件,依据创建的Huffman 树,定义一个指针指向根结点。从根结点开始,每读一个字符,指针变化一次(当读取的字符是1时,指针指向当前所指结点的右孩子,当读取的字符是0时,指针指向当前所指结点的左孩子),直至该指针所指结点为叶子结点时结束(即当结点的左右孩子均为空时)。将当前叶子结点所代表的字符值输出到译码文件中,依次读取编码文件中的字符,按照上述方法依次进行下去直至文件2.3 数据结构定义/huffman树的结点结构体typedef struct HTnodelong weight;/记录结点的权值int parent;/记录结点的双亲结点位置int
23、lchild;/结点的左孩子int rchild;/结点的右孩子int*code;/记录该结点的huffman编码int codelen;/记录该结点huffman编码的长度HTnode()weight=MAX;parent=-1;lchild=-1;rchild=-1;codelen=0;HTnode;2.4 定义 huffman 数类及其函数class huffmanTreepublic:huffmanTree();virtual huffmanTree();bool count(char*input);/压缩时统计各字符出现的次数,将其写入对应结点的权值void create();/压缩
24、时根据各结点的权值构造 huffman树void code();/压缩时利用huffman树计算每个字符的huffman编码void addbit(int bit);/压缩时对一个未满8个bit的byte中加入一个bitvoid resetbyte();/将byte清空bool compress(char*input,char*output);/压缩函数,成功返回 true失败 falsebool decompress(char*input,char*output);/解压函数,成功返回true 失败falsevoid compare(char*input,char*output);/将原文件
25、与压缩后的文件比较private:int root;/记录根结点的位置int leafnum;/记录不同字符的个数HTnode HTleaf*2-1;/HTnode结构的数组,用来表示huffman树,树的最大结点个数不会超过leaf*2-1char byte;/压缩文件时用来缓冲bit的变量int bitsnum;/byte中bit的个数int lacknum;/压缩到最后byte中的bit不满8个时填充的0的个数;2.5 主程序的流程及模块间关系主函数实例化 huffmanTree 类,并实现菜单工具栏,通过用户的选择输入,用 switch语句进行分支执行 huffmanTree 类中功能
26、函数:1:压缩函数 bool compress(char*input,char*output)2:解压函数 bool decompress(char*input,char*output)并可在完成相应功能后安全退出,压缩或解压的文件在同文件夹下生成。3.3.详细设计详细设计核心算法-huffman 算法:3.1 根据给定的 n 个权值w1,w2,wn构成 n 棵二叉树的集合 F=T1,T2,Tn,其中每棵二叉树 T1 中只有一个带权的 w1 的根据点,其左右子树均空。3.2 在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右树上根结点的权
27、值之和。3.3 在 F 中删除这两棵树,同时将所得到的二叉树加入 F 中。3.4 重复 3.2,3.3,直到 F 中只含一棵树为止。这棵树便是 Huffman 树。Huffman 树可用于构造代码总长度最短的编码方案。为了详细说明这个问题,特以下面例子来说明:假设我们有这么一串 20 个字母的数据:44默认情况下,用 2 位 2 进制码来表示这四个字母:A AB BC CD D00 01 10 11每个字符在字符串中各自出现的次数并不相等:A:6 次 B:10 次 C:3 次 D:1 次而在计算机中,数据则是以 2 进制码的形式储存在硬盘上的:00 00 01 00 00 01 01 10 0
28、1 00 01 01 01 10 01 01 00 01 11 10压缩过程如下:注明每个字符的出现次数。把两个出现次数最小的字符圈到一起,看作一个新字符,新字符的次数为两个组成字符的次数之和。重复上述操作,直至完成对所有字符的处理。这种操作形成的结构看起来像棵树(下图),被称为霍夫曼(Huffman)树。图 2 构造哈夫曼树在每一层的分支线上,按下图所示分别标上 0 和 1。图 3 哈弗曼编码从最顶端往下读,每个字符都有唯一的分支编号连到它那里,无重复也无遗漏,这样就得到了 ABCD 这四个字符的新的代码:A A B BC CD D10 0 110 111用以上新编码代入原字符串中,得到:1
29、0 10 0 10 10 0 0 110 0 10 0 0 0 110 0 0 10 0 111 110主程序模块:图 4 程序模块压缩函数compresshuffmanTree类主函数菜单对比函数compare2恢复函数decompressHuffman编码流程计算左右分支权值大小,进行无重复前缀编码初始化节点打开文本文件统计文件长度构建哈夫曼树哈夫曼编码位操作压缩存储NO压缩文件失败YES压缩文件成功!计算压缩率%图 5 编码流程Huffman解码流程YES解压压缩文件成功!在单字节内对相应位置补0NO根据哈夫曼编码的长短,对节点进行排序打开压缩文件读取原文件长度进行文件定位通过哈夫曼编码
30、的长短,依次解码,从原来的位存储还原到字节存储解压缩文件失败!图 6 解码流程4.4.调试分析报告调试分析报告实现压缩率时出现了主观上的错误,压缩率=(total1-total2)/total1*100%,经百度后发现:压缩率(Compression ratio),描述压缩文件的效果名,是文件压缩后的大小与压缩前的大小之比,比如你把100m的文件压缩后是90m,压缩率就是90/100*100%=90%,压缩率一般是越小越好,但是压得越小,时间越长。5如下图:图 7 压缩率测试结果将压缩率改正为:total2/total1*100%,再进行测试的结果如下图:图 8 改正后的测试结果5.5.用户使
31、用说明用户使用说明在运行程序之前,首先在e盘先建立一个待压缩的文件222.txt,运行程序如下图所示。图 9 版本测试结果图压缩:压缩:在命令行下输入 1 对文件进行压缩,根据提示输入刚刚建的文本文件(222.txt),和要生成的压缩文件名称,按回车确认进行压缩。图 10 执行压缩操作图成功执行完毕后如下图所示。图 11 执行压缩操作图解压:解压:在命令行下输入2对本程序压缩的文件进行恢复,根据提示输入待恢复的文件名称和恢复后的文件名称,按回车确定,成功执行后如下图所示。图 12 执行解压操作图对比:对比:原文件 222.txt图 13 待压缩文件 222.txt压缩后的文件 111.txt图
32、 14 压缩后的文件 111.txt解压后的文件 333.txt图 15 解压后的文件333.txt6.6.测试结果测试结果详细测试结果请参见 5 使用功能。6.1测试报告12原文件txt文件(7kb)pdf文件(1080kb)3jpg文件(81kb)4Mp3文件(924kb)913 kb80 kb压缩后6 kb1052 kb解压后7 kb无法解压得到原文件无法解压得到原文件无法解压得到原文件打开解压后的pdf文件时提示如下:图 16 打开解压后pdf文件的提示打开解压后的jpg和mp3文件同样遇到无法打开的提示。参考文献参考文献11严蔚敏,李冬梅,吴伟民严蔚敏,李冬梅,吴伟民 .数据结构数据
33、结构(C(C语言版语言版)M.)M.北京北京:人民邮电出版社,人民邮电出版社,2011.2011.22谭浩强谭浩强.C+.C+面向对象程序设计面向对象程序设计(第二版第二版)M.)M.北京:中国铁道出版社,北京:中国铁道出版社,2009.2009.33潘玮华潘玮华.用用HuffmanHuffman编码进行文件压缩的方法编码进行文件压缩的方法 J.J.电脑知识与技术电脑知识与技术,2010,2010年年0707期期.4kaikai.4kaikai.数据是怎么被压缩的数据是怎么被压缩的OL.OL.http:/ /队列容器using namespace std;const int leaf=256;
34、const long MAX=99999999;typedef struct HTnodelong weight;int parent;int lchild;int rchild;int*code;int codelen;HTnode()weight=MAX;parent=-1;lchild=-1;/最多可能出现的不同字符数/表示无穷大/记录结点的权值/记录结点的双亲结点位置/结点的左孩子/结点的右孩子/记录该结点的huffman编码/记录该结点huffman编码的长度rchild=-1;codelen=0;HTnode;class huffmanTreepublic:huffmanTree(
35、);virtual huffmanTree();bool count(char*input);void create();void code();/统计各字符出现的次数,将其写入对应结点的权值/构造huffman树/计算每个字符的huffman编码/压缩时对一个未满8个bit的byte中加入一个bit/将byte清空/压缩函数 成功执行返void addbit(int bit);void resetbyte();bool compress(char*input,char*output);回 true 失败 falsebool decompress(char*input,char*output)
36、;/解压函数 成功执行返回 true 失败 falsevoid compare(char*input,char*output);/将原文件与压缩后的文件比较private:int root;int leafnum;/记录根结点的位置/记录不同字符的个数/HTnode结构的数组,用来表示huffman树,树的最大HTnode HTleaf*2-1;结点个数不会超过leaf*2-1;char byte;int bitsnum;int lacknum;/压缩文件时用来缓冲bit的变量/byte中bit的个数/压缩到最后byte中的bit不满8个时填充的0的个数huffmanTree:huffmanT
37、ree()huffmanTree:huffmanTree()/统计各字符出现的次数bool huffmanTree:count(char*input)for(int i=0;ileaf;i+)if(HTi.codelen!=0)delete HTi.code;/初始化成员变量root=0;leafnum=0;byte=0;bitsnum=0;lacknum=0;ifstream ifs;char c;ifs.open(input,ios:binary);if(!ifs)cout 无法打开文件 input !endl;return false;while(ifs.get(c)if(HTc+128
38、.weight=MAX)/若该字符是第一次出现,先初始化权值HTc+128.weight=0;leafnum+;HTc+128.weight+;/权值+1ifs.close();return true;/选权值最小的两棵树组成新的数void huffmanTree:create()for(int i=leaf;i2*leaf-1;i+)int loc1=-1,loc2=-1;for(int j=0;ji;j+)if(HTj.parent!=-1)continue;if(loc1=-1|HTj.weight HTloc1.weight)loc2=loc1;loc1=j;else if(loc2=
39、-1|HTj.weight loc2?loc2:loc1;HTi.rchild=loc1loc2?loc1:loc2;HTloc1.parent=i;root=i;HTloc2.parent=i;for(int i=0;i=0;j-)/从后往前找,记录结点的huffman编码if(loc=HTHTloc.parent.lchild)HTi.codej=0;/计算huffman编码长度len+;loc=HTloc.parent;elseHTi.codej=1;loc=HTloc.parent;/压缩时对一个未满8个bit的byte中加入一个bitvoid huffmanTree:addbit(i
40、nt bit)if(bit=0)byte=byte 1;/若新增的bit为0,则直接将byte按位左移elsebyte=(byte 1)|1);/若新增的bit为1,先将byte按位左移,再与1按位或运算/将byte清空void huffmanTree:resetbyte()/压缩函数 成功执行返回 true 失败 falsebool huffmanTree:compress(char*input,char*output)if(!count(input)return false;bitsnum+;byte=0;bitsnum=0;create();code();ifstream ifs;ofs
41、tream ofs;ifs.open(input,ios:binary);ofs.open(output,ios:binary);char c;if(!ifs)if(!ofs)ofs.put(0);/预留一个字符,等压缩完后在该位置写入不足一个 byte的bit个数ofs.put(root-384);/将根节点的位置-384写入(为使该值不超过char的最大表示cout 无法打开文件 output !endl;return false;cout 无法打开文件 input !endl;return false;范围)for(int i=0;ileaf*2-1;i+)/写入每个结点的双亲结点位置/
42、若该节点没有双亲结点,则写入127(一个字节所能if(HTi.parent=-1)表示的最大值)ofs.put(127);/否则将双亲结点的位置-384再写入(为使该值不超过char的最大表示else范围)ofs.put(HTi.parent-384);while(ifs.get(c)if(bitsnum!=0)/处理最后未满8个字符的byte,用0填充并记录填充的个数ofs.seekp(0,ios:beg);/将写指针移动到文件开头ofs.put(lacknum);ifs.close();ofs.close();return true;/写入最后一个字节缺失的bit个数for(int i=b
43、itsnum;i8;i+)ofs.put(byte);resetbyte();addbit(0);lacknum+;/将字符的huffman编码并加入byte中int tmp=c+128;for(int i=0;iHTtmp.codelen;i+)addbit(HTtmp.codei);if(bitsnum=8)/若byte已满8位,则输出该byte并将byte清空ofs.put(byte);resetbyte();/解压函数 成功执行返回 true 失败 falsebool huffmanTree:decompress(char*input,char*output)queue q;char
44、c;ifstream ifs;ofstream ofs;ifs.open(input,ios:binary);ofs.open(output,ios:binary);if(!ifs)if(!ofs)ifs.get(c);lacknum=c;ifs.get(c);root=c+384;/读出根结点的位置for(int i=0;ileaf*2-1;i+)/建立各结点之间的双亲孩子关系/读出最后一个字节缺失的bit个数cout 无法打开文件 output !endl;return false;cout 无法打开文件 input !1)/还未到最后一个字节c=q.front();for(int i=0
45、;i8;i+)if(int(c&128)=0)point=HTpoint.lchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)c=c 1;q.push(c);ofs.put(char(point-128);point=root;elsepoint=HTpoint.rchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)c=c 1;ofs.put(char(point-128);point=root;q.pop();c=q.front();/最后一个字节for(i=0;i8-lacknum;i+)if(int(c&128
46、)=0)elsepoint=HTpoint.rchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)point=HTpoint.lchild;if(HTpoint.lchild=-1&HTpoint.rchild=-1)c=c 1;ofs.put(char(point-128);point=root;c=c 1;ofs.put(char(point-128);point=root;q.pop();ifs.close();ofs.close();return true;/将原文件与压缩后的文件比较void huffmanTree:compare(char*in
47、put,char*output)ifstream origin,compress;origin.open(input,ios:binary);compress.open(output,ios:binary);if(!origin)if(!compress)cout 无法打开文件 output !endl;return;cout 无法打开文件 input !endl;return;double total1=0,total2=0;char c;while(origin.get(c)total1+;while(compress.get(c)total2+;cout 原文件大小:total1 Byt
48、e endl;cout 压缩后大小:total2 Byte endl;cout 压缩率:total2/total1*100%endl;origin.close();compress.close();void main()int choice=1;char input255,output255;huffmanTree h;while(choice)cout*endl;cout*基于哈夫曼树的文件压缩/解压程序 *endl;cout*endl;cout*1)压缩 *endl;cout*endl;cout*2)解压 *endl;cout*endl;cout*0)退出 *endl;cout*endl;
49、cout*说明:请输入相应的操作序号 *endl;cout*endl;cout choice;switch(choice)case 1:break;cout input;cout output;if(press(input,output)pare(input,output);cout文件压缩成功!endl;elsecout文件压缩失败!endl;case 2:cout input;cout output;if(h.decompress(input,output)cout文件解压成功!endl;elsecout文件解压失败!endl;break;case 0:break;default:cout endl;cout 参数错误!请重新输入 endl;