⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffmancode.cpp

📁 这是一个赫夫曼加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
           (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 + -