基于哈夫曼编码实现文本文件的压缩和解压缩Word文档下载推荐.docx
- 文档编号:20702704
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:15
- 大小:17.19KB
基于哈夫曼编码实现文本文件的压缩和解压缩Word文档下载推荐.docx
《基于哈夫曼编码实现文本文件的压缩和解压缩Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于哈夫曼编码实现文本文件的压缩和解压缩Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
cout<
<
"
\t1.加密压缩2.无密压缩"
endl;
请输入选择:
;
cin>
>
choose;
if(choose==1)
returntrue;
else
returnfalse;
}
voidEncode(vector<
char>
&
v)
charch[30];
v.push_back('
@'
请输入压缩密码"
ch;
for(inti=0;
ch[i]!
='
\0'
i++)
v.push_back(ch[i]);
开始压缩!
voidReadTxt(vector<
charch;
ifstreaminfile("
test.txt"
ios:
:
in);
if(!
infile)
{
cerr<
openerror"
exit
(1);
}
if(IfEncode())
Encode(v);
while(infile.peek()!
=EOF)
infile.get(ch);
v.push_back(ch);
}
infile.close();
voidInitList(TNode&
T)
T.data=newchar[256];
T.num=newint[256];
T.data||!
T.num)
T.length=0;
boolFind(TNodeT,charch)
inti;
for(i=0;
i<
T.length;
if(ch==T.data[i])
returntrue;
returnfalse;
voidTCount(vector<
v1,TNode&
T)
inti,j=0;
intm=v1.size();
m;
ch=v1[i];
if(!
Find(T,ch))
{
T.data[j]=ch;
T.num[j]=count(v1.begin(),v1.end(),ch);
j++;
T.length++;
}
}
voidSelect(HuffmanTree&
HT,intm,int&
s1,int&
s2)
intk,j,n,min=32767;
for(k=1;
k<
=m;
k++)
if(HT[k].parent==0)
if(HT[k].weight<
=min)
{
j=k;
min=HT[k].weight;
}
s1=j;
HT[j].parent=1;
min=32767;
n=k;
s2=n;
voidCreateHuffmanTree(HuffmanTree&
HT,TNodeT,intlength)
intm,i,s1,s2;
if(length<
=1)
return;
m=2*length-1;
HT=newHTNode[m+1];
for(i=1;
++i)
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
=length;
HT[i].weight=T.num[i-1];
for(i=length+1;
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
voidCreatHuffmanCode(HuffmanTreeHT,HuffmanCode&
HC,intn)
inti,f,c,start;
HC=newchar*[n+1];
char*cd=newchar[n];
cd[n-1]='
=n;
start=n-1;
c=i;
f=HT[i].parent;
while(f!
=0)
--start;
if(HT[f].lchild==c)
cd[start]='
0'
else
1'
c=f;
f=HT[f].parent;
}
HC[i]=newchar[n-start];
strcpy(HC[i],&
cd[start]);
deletecd;
intgetFileSizeSystemCall(char*strFileName)
{
structstattemp;
stat(strFileName,&
temp);
returntemp.st_size;
}
voidZip(HuffmanCodeHC,vector<
v,TNodeT)
inti=0,j=0,k=0;
ofstreamoutfile("
zip.txt"
out);
outfile)
输出哈夫曼编码"
v.size();
for(j=0;
j<
j++)
if(T.data[j]==v[i])
break;
for(k=0;
HC[j+1][k]!
{cout<
HC[j+1][k]<
"
outfile<
HC[j+1][k];
outfile.close();
正在压缩。
Sleep(500);
cout<
。
压缩成功!
可到zip.txt中查看压缩后文件"
boolREncode(charch[])
inti=0;
charcode[30];
请输入解压密码:
code;
if(strcmp(code,ch)==0)
intin_HM(Code&
c)
c.data=newchar[256];
c.HM=newchar*[256];
intlength=0,i;
code.dat"
infile>
length;
infile>
c.data[i];
c.HM[i]=newchar[length+1];
c.HM[i];
returnlength;
voidout_HM(HuffmanCodeHC,TNodeT)
outfile<
T.length<
outfile<
T.data[i]<
HC[i+1]<
voidRZip(HuffmanCodeHC,TNodeT)
charch2[30];
inti,j,flag,flag2=0,m=0;
rzip.txt"
{
flag=0;
char*cd=newchar[T.length];
for(i=0;
infile>
cd[i]=ch;
cd[i+1]='
for(j=1;
=T.length;
if(strcmp(HC[j],cd)==0)
{
if(T.data[j-1]=='
)
{
if(flag2==0)
{
flag=1;
flag2=1;
deletecd;
break;
}
if(flag2==1)
while
(1)
{
if(REncode(ch2))
{
cout<
密码正确,正在解压!
flag2=0;
break;
}
else
密码错误,请重新输入"
}
}
}
if(flag2==1)
{
ch2[m]=T.data[j-1];
flag=1;
m++;
deletecd;
break;
if(flag2==0)
outfile<
T.data[j-1];
}
if(flag==1)
正在解压。
解压成功!
请到rzip.txt中查看解压后文件"
<
voidabout()
cls"
\t╔═══════════════════════════════╗"
\t║欢迎使用解压缩程序║"
\t║关于程序:
║"
\t║压缩:
\t║默认压缩程序所在目录下的test.txt,生成压缩后的zip.txt║"
\t║║"
\t║解压:
\t║默认解压序所在目录下的zip.txt,生成解压后的rzip.txt║"
\t║程序支持压缩中英文文件。
\t╚═══════════════════════════════╝"
voidmenu()
\t║1.压缩文件║"
\t║2.解压文件║"
\t║3.具体信息║"
\t║4.退出程序║"
intmain()
vector<
v;
intn,choose,size1,size2,size3;
TNodeT;
InitList(T);
HuffmanTreeHT;
HuffmanCodeHC;
while
(1)
system("
menu();
cout<
请输入所选择的序号:
cin>
switch(choose)
case1:
ReadTxt(v);
TCount(v,T);
n=T.length;
CreateHuffmanTree(HT,T,n);
CreatHuffmanCode(HT,HC,n);
Zip(HC,v,T);
size1=getFileSizeSystemCall("
cout<
原文件中有"
size1<
个字节"
cout<
size2=getFileSizeSystemCall("
压缩后有"
size2<
out_HM(HC,T);
system("
pause"
case2:
RZip(HC,T);
size3=getFileSizeSystemCall("
解压缩后有"
size3<
case3:
about();
case4:
return0;
default:
输入错误!
请重新输入"
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 哈夫曼 编码 实现 文本文件 压缩 和解