📄 text.txt
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include <malloc.h>
#define NULL 0
#define OK 1
#define ERROR 0
typedef struct HTNODE{
char Code;
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
typedef struct {
int num;
char t;
}statis;
typedef struct
{
char bcode[100];
}encodetable[256];
void Select(HuffmanTree &HT,int k,int *s1,int *s2);
void BuildHfTree(HuffmanTree &HT,encodetable &table1,int n);
//-------------------- -----------------//
void tongji(char *path)
{
int num;
FILE *fp0,*fp1;
statis statmp[256],sta[256];
char temp;
int i,j,tmp=0,flag=0;
for(j=0;j<255;j++)
{
statmp[j].num=0;
statmp[j].t=0;
}
if (path[0]=='*')fp0=fopen("text.txt","rb");
else
fp0=fopen(path,"rb");
fp1=fopen("tongji.txt","wb");
for (;fread(&temp,sizeof(char),1,fp0)==1;)
{
if((int)temp>=0&&(int)temp<=255)
{
statmp[(int)temp].num++;
statmp[(int)temp].t=temp;
}
}
i=0;
j=0;
while(i<=255)
{
if(statmp[i].num!=0)
{
sta[j].t=statmp[i].t;
sta[j].num=statmp[i].num;
i++;
tmp++;
j++;
}
else i++;
}
num=tmp-1;
cout<<num<<endl;
fwrite(&num,sizeof(int),1,fp1);
for(i=0;i<num;i++)fwrite(&sta[i],sizeof(statis),1,fp1);
fclose(fp0);
fclose(fp1);
return;
}
//----------- --------------------//
int Init(encodetable &table)
{
FILE *fp[2];
HuffmanTree HT;
int i,m,n,flag=0;
statis sta[256];
if((fp[0]=fopen("huffman.txt","wb"))== NULL)
{
cout<<"cannot open file "<<endl;
return ERROR;
}
if((fp[1]=fopen("tongji.txt","rb"))== NULL)
{
cout<<"cannot open file "<<endl;
return ERROR;
}
fread(&n,sizeof(int),1,fp[1]);
m=2*n-1;
for(i=0;i<n;i++)fread(&sta[i],sizeof(statis),1,fp[1]);
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;++i)
{
HT[i].Code=sta[i-1].t;
HT[i].weight=sta[i-1].num;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
}
for(i=n+1,HT[i].Code=HT[i-1].Code+1;i<=m;++i)
{
HT[i].parent=0;
HT[i].Code='^';
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].weight=0;
}
BuildHfTree(HT,table,n);
for(i=1;i<=m;i++)
fwrite(&HT[i],sizeof(HTNode),1,fp[0]);
fclose(fp[0]);
return OK;
}
//----------------- -------------------//
void BuildHfTree(HuffmanTree &HT,encodetable &table1,int n)
{ int i,m,start,c,f;
char *cd;
int s1,s2;
m=2*n-1;
for(i=n+1;i<=m;++i)
{
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;
}
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
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';}
}
strcpy(table1[(int)HT[i].Code].bcode,&cd[start]);// Assic
}
}
//--------------- --------//
void Select(HuffmanTree &HT,int k,int *s1,int *s2)
{
int i=1,a=1,b=1;
while(a<=k)
{
if(HT[a].parent==0)break;
else a++;
}
while(i<=k)
{
if(HT[i].parent==0&&HT[i].weight<HT[a].weight)
{a=i;i++;}
else i++;
}
*s1=a;
while(b<=k)
{
if(HT[b].parent==0&&b!=a)break;
else b++;
}
i=1;
while(i<=k)
{
if(HT[i].parent==0&&i!=a&&HT[i].weight<HT[b].weight)
{b=i;i++;}
else i++;
}
*s2=b;
}
//------------------ -----------------------//
int Tree_prin(HuffmanTree &HT,HTNode &H)
{
char tmp[256];
char t=':';
FILE *fp;
fp=fopen("PrinTree.txt","a");
int i;
fwrite(&H.Code,sizeof(char),1,fp);
fwrite(&t,sizeof(char),1,fp);
for(i=0;i<256;i++)tmp[i]='\0';
if(H.parent)
{
for(i=0;i<=H.parent/4;i++)tmp[i]='-';
tmp[i]='\n';
}
else
{
for(i=0;i<80;i++)tmp[i]='-';
tmp[i]='\n';
}
fputs(tmp,fp);
fclose(fp);
if(H.lchild&&H.rchild)
{
if(Tree_prin(HT,HT[H.lchild]))
if(Tree_prin(HT,HT[H.rchild]))
return OK;
return ERROR;
}
else return OK;
}
//--------------------- CodeFile.txt---------------------------//
void Encode( encodetable &table,char *path1 ,char *path2)
{ FILE *fp0,*fp1;
char Asiscode[100];
char temp;unsigned int j,flag=0;
if(path1[0]=='*')
fp0=fopen("text.txt","rb");
else fp0=fopen(path1,"rb");
if(path2[0]=='*')
fp1=fopen("CodeFile.txt","wb");
else
fp1=fopen(path2,"wb");
for (;fread(&temp,sizeof(char),1,fp0)==1;)
{
for(j=0;j<100;j++)
Asiscode[j]='\0';
strcpy(Asiscode,table[(int)temp].bcode);
fputs(Asiscode,fp1);
}
fclose(fp0);
fclose(fp1);
}
//------------------- -------------------//
void TrantoBit()
{
int i,Bit;
char asc[32];
FILE *fp1,*fp2;
if((fp1=fopen("CodeFile.txt","rb"))==NULL)
{
cout<<" CodeFile.txt"<<endl;
return;
}
fp2=fopen("CodeBit","wb");
for(i=0;i<32;i++)asc[i]='0';
for(;fread(asc,sizeof(char),32,fp1)!=0;)
{
Bit=0;
for(i=0;i<32;i++)
{
if(asc[i]=='1')Bit=Bit|(1<<i);
asc[i]='0';
}
fwrite(&Bit,sizeof(int),1,fp2);
}
fclose(fp2);
fclose(fp1);
cout<<" CodeBit.txt"<<endl;
}
//------------ ---------------//
void Decode(char *path1,char *path2)
{ HuffmanTree p;
FILE *fp[3];
int num=0,i;
int cod;
char txt,code1;
HuffmanTree HH;
HH=(HuffmanTree)malloc(257*sizeof(HTNode));
if (path1[0]=='*')
fp[0]=fopen("CodeFile.txt","rb");
else fp[0]=fopen(path1,"rb");
if((fp[1]=fopen("TextCode.txt","wb"))== NULL)
{
cout<<"cannot open file "<<endl;
return ;
}
if (path2[0]=='*')
fp[2]=fopen("huffman.txt","rb");
else fp[2]=fopen(path2,"rb");
for(i=1;fread(&HH[i],sizeof(HTNode),1,fp[2])==1;){i++;num++;}//
for(p=&HH[num];fread(&code1,sizeof(char),1,fp[0])==1;)
{
if(p->lchild||p->rchild)
{ cod=(int)code1-48;
if(cod==0)p=&HH[p->lchild];
else if(cod==1)p=&HH[p->rchild];
}
if(!(p->lchild||p->rchild))
{
txt=p->Code;
fwrite(&txt,sizeof(char),1,fp[1]);
p=&HH[num];
}
}
fclose(fp[0]);
fclose(fp[1]);
fclose(fp[2]);
}
//------------- ----------------//
void BitDcode()
{
int i,Bit;
char asc[32];
FILE *fp1,*fp2;
if((fp1=fopen("CodeBit","rb"))==NULL)
cout<<" CodeBit.txt"<<endl;
fp2=fopen("CodeFile.txt","wb");
for(;fread(&Bit,sizeof(int),1,fp1)>0;)
{ for(i=0;i<32;i++)asc[i]='0';
for(i=0;i<32;i++)
if(Bit&(1<<i))asc[i]='1';
fwrite(asc,sizeof(char),32,fp2);
}
fclose(fp2);
fclose(fp1);
}
//-------------- -------------//
void main()
{ char SEL;
int i,flag1=0,flag2=0,num=0;
char path1[40],path2[40];
FILE *fp0,*fp1,*fpx;
encodetable table;
HuffmanTree HH;
HH=(HuffmanTree)malloc(257*sizeof(HTNode));
while(!flag2)
{
while(!flag1)
{
cout<<" :E, :B, & :D, :T, :Q"<<endl;
cin>>SEL;
if(SEL!='E'&&SEL!='D'&&SEL!='T'&&SEL!='Q'&&SEL!='B')cout<<" "<<endl;
else flag1=1;
}
switch(SEL)
{
case 'E':
{
for (i=0;i<40;i++){path1[i]='\0';path2[i]='\0';}
cout<<" text.txt)"<<endl;
cin>>path1;
cout<<" CodeFile.txt)"<<endl;
cin>>path2;
tongji(path1);
Init(table);
Encode(table,path1,path2);
cout<<" :hffman.txt"<<endl;
flag1=0;
break;
}
case 'B':
{
TrantoBit();
flag1=0;
break;
}
case 'D':
{
for (i=0;i<40;i++){path1[i]='\0';path2[i]='\0';}
if(((fopen("CodeFile.txt","r"))==NULL)&&((fpx=fopen("CodeBit","r"))==NULL))
cout<<" CodeFile.txt或CodeBit"<<endl;
path1[0]='*';
if((fpx=fopen("CodeBit","r")))
{
fclose(fpx);
BitDcode();
}
cout<<" huffman.txt)"<<endl;
cin>>path2;
Decode(path1,path2);
cout<<" TextFile.txt"<<endl;
flag1=0;
break;
}
case 'T':
{
fp0=fopen("huffman.txt","rb");
fp1=fopen("PrinTree.txt","wb");
fclose(fp1);
for(i=1;fread(&HH[i],sizeof(HTNode),1,fp0)==1;){i++;num++;}
Tree_prin(HH,HH[num]);
cout<<" PrinTree.txt"<<endl;
flag1=0;
break;
}
case 'Q':
{
flag2=1;
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -