用C++编写的文件压缩解压程序Word文件下载.docx
- 文档编号:22580217
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:32
- 大小:22.29KB
用C++编写的文件压缩解压程序Word文件下载.docx
《用C++编写的文件压缩解压程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《用C++编写的文件压缩解压程序Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
<
\t
&
***************
压缩软件 **************&
\n"
*
*\n"
*\n\n\n"
运行本软件之前,请务必仔细阅读使用指南
*"
\n\n\n\n\n\n\n\n\n\n"
cin.unsetf(ios:
:
skipws);
cin>
>
meiyong;
cin.setf(ios:
ifstreamfin("
使用说明.txt"
ios:
binary);
fin.unsetf(ios:
while(fin>
meiyong)
{
}
getch();
fin.setf(ios:
fin.close();
\n\n\n\n\n\n"
\t\t*-------------------------------------------*\n"
\t\t*
实验六:
霍夫曼树的应用
*\n"
*******
*******\n"
作者:
gdgzzch
学号:
15201314
\t\t*-------------------------------------------*\n\n"
2005.11.16\n\n"
menu();
intchoice;
请选择操作:
"
choice;
while
(1)
switch(choice)
case1:
Compress();
break;
case2:
Decompress();
case3:
Ceshi();
case0:
\n\n\t\t*********
您使用本软件,再见!
***********\n\n\n\n"
return1;
default:
无此操作!
\n\n"
endl<
//----------------------------------------------------------
//compress1.h
//压缩
#ifndefCOMPRESS
#defineCOMPRESS
iostream.h>
string.h>
//压缩函数
voidCompress()
unsignedcharch;
inti,j,k;
intCharnum[256];
//
unsignedcharChars[256];
//与下面共同使用,记录字符
intCharnums[256];
//记录对应字符的个数
intCharKinds;
//字符种数
charfilenameorg[21];
//文件名不超过20个字符源文件名
charfilenameaim[21];
//目标文件名
intfileorgsize;
//源文件大小
intfileaimsize;
//压缩文件大小
HuffmanTree<
unsignedchar>
ht;
CharNameNodeNameNode[256];
//存储字符对应的霍夫曼编码
BinTreeNode<
*btn=NULL;
Code*first=NULL;
Code*last=NULL;
ifstreamfilein;
ofstreamfileout;
请输入你要压缩的文件的名字:
filenameorg;
filein.open(filenameorg,ios:
nocreate|ios:
//open:
filenameorg
if(!
filein)
filenameorg<
不存在!
filein.clear();
请输入你的压缩文件的名字(*.HFM):
//以后再用
filenameaim;
charfiletype[5];
intlen;
len=strlen(filenameaim);
if(len<
=4)
filenameaim<
文件的扩展名必须为HFM\n"
return;
for(i=len-1,j=3;
i>
=len-4;
i--,j--)
filetype[j]=filenameaim[i];
filetype[4]='
\0'
if(strcmp(filetype,"
.HFM"
)!
=0)
//
******************************************************
for(i=0;
i<
256;
i++)
Charnum[i]=0;
//记录每一个字符的个数
Charnums[i]=0;
//记录字符Char[i]的个数
filein.unsetf(ios:
fileorgsize=0;
//计算源文件大小
while(filein>
ch)
Charnum[unsignedint(ch)]++;
//统计每种字符的频数
fileorgsize++;
filein.setf(ios:
filein.close();
//close:
filenameorg
j=0;
if(Charnum[i])
Chars[j]=unsignedchar(i);
//统计源文件中存在的字符的
Charnums[j]=Charnum[i];
j++;
CharKinds=j;
fileaimsize=0;
//计算压缩文件大小
fileout.open(filenameaim,ios:
fileout<
'
0'
'
//非法位数(之后修改)
CharKinds<
//存入字符种类
fileaimsize+=7;
CharKinds;
Chars[i]<
Charnums[i]<
//将字符信息存入临时文件
fileaimsize+=10;
ht.Build(Charnums,Chars,CharKinds,ht);
//建立霍夫曼树
i=0;
ht.Path(ht.GetRoot(),first,last,NameNode,i);
//搜索霍夫曼树求得字符对应的霍夫曼编码
***********************************************************
k=0;
while(ch!
=NameNode[i].charname)
//找到ch
i++;
Code*p=NameNode[i].link;
while(p!
=NULL)
j<
=1;
j+=p->
code;
k++;
if(k==8)
unsignedchar(j);
fileaimsize++;
p=p->
link;
if(k<
8)
=(8-k);
fileout.seekp(0,ios:
beg);
8-k;
//修改非法代码的位数
fileout.close();
Code*q=NameNode[i].link;
Code*s=NULL;
while(q!
s=q;
q=q->
deletes;
NameNode[i].link=NULL;
//清除链表信息
ht.Destroy();
文件压缩成功!
压缩率为:
(fileaimsize*100)/fileorgsize<
%'
voidDecompress()
unsignedinttotal;
//记录字符转化后的数
intfpend;
//暂存文件指针的最后位置
//文件名不超过20个字符源文件名
请输入你要解压的文件的名字:
len=strlen(filenameorg);
不是霍夫曼编码的程序,不能解压!
filetype[j]=filenameorg[i];
/*
请输入你解压后的文件的名字:
*/
解压失败,请重试!
filein.seekg(0,ios:
end);
fpend=filein.tellg();
//记录文件尾的位置
//恢复
filein>
k>
ch;
//最后一个字符不合法的位数
filenameaim>
CharKinds>
Chars[i]>
ch>
Charnums[i]>
//载入字符信息
btn=ht.GetRoot();
//以文本文件打开
fileout)
目标文件创建失败,请重试!
fileout.clear();
total=(unsignedint)(ch);
//这里都是正确的
if(filein.tellg()==fpend)
//到了文件尾
j=k;
//留k位不输出
for(i=7;
=j;
i--)
if(total&
(1<
i))
//这一位是1向右子树走
btn=btn->
GetRight();
else
GetLeft();
//
if(btn->
GetData()!
GetLeft()==NULL&
&
btn->
GetRight()==NULL)
GetData();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 编写 文件 压缩 解压 程序