📄 huffmancode.cpp
字号:
(list+i)->weight=list2.weight;
HeapAdjust(1,i-1);
}
s1=(list+1)->num;
s2=(list+2)->num;
int s3;
if(s1>s2)
{
s3=s1;
s1=s2;
s2=s3;
}
}
//************************************************************
//
//把Huffman编码保存到文件中
//
//************************************************************
void SaveHuffmanCode(ofstream &outFile,ifstream inFile,char wchar[],HuffmanCode HC)
{
int i=1,k;
char ch,str[81];
inFile.getline(str,81,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
ch=str[k];
k++;
i=1;
while(ch!=wchar[i])
{
i++;
}
outFile<<HC[i];
}
if(k!=80)
{
ch='\n';
i=1;
while(ch!=wchar[i])
{
i++;
}
outFile<<HC[i];
}
while(!inFile.eof())
{
inFile.getline(str,81,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
ch=str[k];
k++;
i=1;
while(ch!=wchar[i])
{
i++;
}
outFile<<HC[i];
}
if(k!=80)
{
ch='\n';
i=1;
while(ch!=wchar[i])
{
i++;
}
outFile<<HC[i];
}
}
}
//**************************************************************************
//
//解码,并保存到文件中去.
//
//**************************************************************************
void UnHuffmancode(void)
{
char wchar[128];
int n;
int flag;
int i,j;
HuffmanCode HC;
struct HTNode *HT;
char inFileName[20],outFileName[20],NumName[20],CharName[20],HTName[20];
ifstream numinformation;
ifstream charinformation;
ifstream HTinformation;
ifstream inFile;
ofstream outFile;
cout<<" 解码介面\n\n\n";
cout<<"请输入进行解码的文件名: ";
cin>>inFileName;
cin.ignore();
cout<<endl;
cout<<"请输入进行解码的其它相关文件 \n\n";
cout<<"请输入字符个数文件名: ";
cin>>NumName;
cin.ignore();
cout<<"请输入字符内容文件名: ";
cin>>CharName;
cin.ignore();
cout<<"请输入编码信息文件名: ";
cin>>HTName;
cin.ignore();
cout<<endl;
cout<<"请输入解码保存的文件名: ";
cin>>outFileName;
cin.ignore();
cout<<"正在解码......\n\n\n\n\n";
numinformation.open(NumName);
charinformation.open(CharName);
HTinformation.open(HTName,ios::binary);
inFile.open(inFileName);
outFile.open(outFileName);
if(numinformation.fail()&&charinformation.fail()&&HTinformation.fail()&&inFile.fail()&&outFile.fail())
{
cout<<"ERROR OPENING THE FILE!"<<endl;
exit(0);
}
numinformation>>n;
HT=new struct HTNode[2*n];
i=1;
char str[81];
int k;
charinformation.getline(str,80,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
wchar[i]=str[k];
k++;
i++;
}
if(k!=80)
{
wchar[i]='\n';
i++;
}
while(!charinformation.eof())
{
charinformation.getline(str,80,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
wchar[i]=str[k];
k++;
i++;
}
if(k!=80)
{
wchar[i]='\n';
i++;
}
}
i=1;
int m;
m=2*n-1;
while(i<=m)
{
HTinformation.read((char*)(HT+i),sizeof(struct HTNode));
i++;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char *cd;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
int start,c,f;
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
flag=n*2-1;
char ch,*word,ch1;
word=new char[128];
inFile.get(ch);
i=0;
while(!inFile.eof())
{
*(word+i)=ch;
i++;
if(ch=='0')
flag=HT[flag].lchild;
if(ch=='1')
flag=HT[flag].rchild;
ch1=ch;
if(!inFile.get(ch))
{
ch=ch1;
}
if(ch=='0')
if(HT[flag].lchild==0)
{
*(word+i)='\0';
i=0;
flag=2*n-1;
for(j=1;j<=n;j++)
{
if(strcmp(*(HC+j),word)==0)
{
outFile<<wchar[j];
outFile.flush();
delete word;
word=new char[128];
break;
}
}
}
if(ch=='1')
if(HT[flag].rchild==0)
{
*(word+i)='\0';
i=0;
flag=2*n-1;
for(j=1;j<=n;j++)
{
if(strcmp(*(HC+j),word)==0)
{
outFile<<wchar[j];
outFile.flush();
delete word;
word=new char[128];
break;
}
}
}
}
cout<<"解码文件保存到"<<outFileName<<endl;
cout<<"储存完毕\n";
cout<<"\n\n\n按回车键返回主介面";
cin.get(ch);
system("cls");
}
//*********************************************************
//
//显示编码时的各项信息
//
//*********************************************************
void ShowMessage(void)
{
char wchar[128];
int n;
int i;
HuffmanCode HC;
struct HTNode *HT;
int weight[128];
ifstream numinformation;
ifstream charinformation;
ifstream HTinformation;
numinformation.open("num.dat",ios::in);
charinformation.open("char.dat",ios::in);
HTinformation.open("ht.dat",ios::in|ios::binary);
if(numinformation.fail()&&charinformation.fail()&&HTinformation.fail())
{
cout<<"ERROR OPENING THE FILE!"<<endl;
exit(0);
}
numinformation>>n;
HT=new struct HTNode[2*n];
i=1;
char str[81];
int k;
charinformation.getline(str,81,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
wchar[i]=str[k];
k++;
i++;
}
if(k!=80)
{
wchar[i]='\n';
i++;
}
while(!charinformation.eof())
{
charinformation.getline(str,81,'\n');
k=0;
while(k<80&&str[k]!='\0')
{
wchar[i]=str[k];
k++;
i++;
}
if(k!=80)
{
wchar[i]='\n';
i++;
}
}
i=1;
int m;
m=2*n-1;
while(i<=m)
{
HTinformation.read((char*)(HT+i),sizeof(struct HTNode));
i++;
}
i=1;
while(i<=n)
{
weight[i]=(HT+i)->weight;
i++;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char *cd;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
int start,c,f;
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
cout<<" 相关的编码信息\n\n"<<endl;
cout<<" 总共对"<<n<<"个字符进行了编码\n";
cout<<" "<<setw(6)<<"字符"<<setw(6)<<"ASC码"<<setw(6)<<"权值"<<setw(20)<<"编码\n";
i=1;
while(i<=n)
{
if(wchar[i]=='\n')
cout<<" "<<setw(6)<<"回车"<<setw(6)<<int(wchar[i])<<setw(6)<<weight[i]<<setw(20)<<HC[i]<<endl;
else if(wchar[i]==' ')
cout<<" "<<setw(6)<<"空格"<<setw(6)<<int(wchar[i])<<setw(6)<<weight[i]<<setw(20)<<HC[i]<<endl;
else if(int(wchar[i])==9)
cout<<" "<<setw(6)<<"TAB"<<setw(6)<<int(wchar[i])<<setw(6)<<weight[i]<<setw(20)<<HC[i]<<endl;
else if(int(wchar[i])<=31)
cout<<" "<<setw(6)<<"控制字符"<<setw(6)<<int(wchar[i])<<setw(6)<<weight[i]<<setw(20)<<HC[i]<<endl;
else
cout<<" "<<setw(6)<<wchar[i]<<setw(6)<<int(wchar[i])<<setw(6)<<weight[i]<<setw(20)<<HC[i]<<endl;
i++;
}
cout<<"\n\n\n按回车键返回主选单";
char ch;
cin.get(ch);
system("cls");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -