📄 huffman.cpp
字号:
/*__________________________________________________________________________________________________________________
____________________________________________________________________________________________________________________
Huffman编码
任务 :对一篇英文文章,统计各字符出现的次数,实现Huffman编码;
要求:输出每个字符出现的次数和编码,其中求最小权值要求用堆实现;
注意:在Huffman编码后,要将编码表和英文文章编码结果保存到文件中,并提供读编码文件生成原文件的功能。
____________________________________________________________________________________________________________________
___________________________________________________________________________________________________________________*/
#include "stdio.h"
#include "Huffman.h"
void main(){
HuffmanTree HT;
HuffmanCode HC;
FILE *fp1;
char filename[20];
printf("请输入需要进行Huffman编码的文件名: ");
scanf("%s",filename);
if((fp1=fopen(filename,"r"))==NULL) exit(0);
int *w;
w=(int *)malloc((100)*sizeof(int));
printf("进行Huffman编码...\n\n");
/*****************************************************************************************************************
统计ASC码从32——122的字符以及换行符的出现次数,存入数组w(共92个)
*****************************************************************************************************************/
int i;
char findch;
findch=' ';
for(i=0;i<=90;i++){
w[i]=emergetime(filename,findch);
findch++;
}
w[91]=emergetime(filename,char(10));//记录换行符
HuffmanCoding(HT,HC,w,92);
printf("统计结果及Huffman编码:\n\n");
int j;
for(j=0;j<=90;j++){
printf("字符 %c 出现的次数为:%d \t",' '+j,w[j]);
printf("Huffman编码: %s\n", HC[j+1]);
}
printf("换行符出现的次数为:%d \t",w[91]);
printf("Huffman编码: %s\n", HC[92]);
printf("\n");
/*****************************************************************************************************************
将编码表存入myfile2文件中
*****************************************************************************************************************/
FILE *fp2;
if((fp2=fopen("myfile2.txt","w"))==NULL) exit(0);
fprintf(fp2,"%s\n","编码表:");
for(j=1;j<=91;j++){
fprintf(fp2,"%c ",' '+j-1);
fprintf(fp2,"%s\n",HC[j]);
}
fprintf(fp2,"%s ","换行符");
fprintf(fp2,"%s\n",HC[92]);
/*****************************************************************************************************************
对原文件中英文文章编码,存入文件myfile2中
*****************************************************************************************************************/
fprintf(fp2,"%s\n","编码后的文章为:");
char ch;
ch=fgetc(fp1);
while(ch!=EOF){
for(j=1;j<=91;j++){
if(ch==' '+j-1){
fprintf(fp2,"%s",HC[j]);
break;
}
}
if(ch==char(10)) fprintf(fp2,"%s",HC[92]);
ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
printf("编码表和编码文章已存入文件myfile2中。\n\n");
/*****************************************************************************************************************
对编码文件解码,生成原文件存入文件myfile3中
*****************************************************************************************************************/
printf("下面将编码文件译为原文...\n\n");
system("pause");
system("cls");
/*************************************读编码表********************************************/
if((fp2=fopen("myfile2.txt","r"))==NULL) exit(0);
char str[30];
fgets(str,30,fp2); //读取一行(使文件当前指针跳过“编码表:”字样)
for(i=0;i<91;i++){
fgets(str,30,fp2);
HCode[i].ch=str[0];
strcpy(HCode[i].str,&str[4]);//Huffman编码从第四个字符开始
}
fgets(str,30,fp2); //读取换行符编码
HCode[91].ch=char(10);
strcpy(HCode[91].str,&str[9]);
/***************************根据编码表建立二叉树,用于将Huffman编码译为原文****************/
BiTree T;
T=(BiTree)malloc(sizeof(BiTNode));
T->lchild=NULL;
T->rchild=NULL;
for(i=0;i<92;i++){
CreateTree(T,HCode[i]);
}
/**********************下面开始读取编码文件进行译码并写入文件********************************/
FILE *fp3;
if((fp3=fopen("myfile3.txt","w"))==NULL) exit(0);
fgets(str,30,fp2); //读取一行(使文件当前指针跳过“编码文件如下:”字样)
BiTree F;
F=T; //先指向建立的二叉树T的根
ch=fgetc(fp2);
while(ch!=EOF){
if(ch=='0')
{
if(F->lchild) {F=F->lchild;ch=fgetc(fp2);}
else
{
printf("%c",F->data); //F已经是叶子节点,则输出该节点字符.
//此时的ch已经属于下一个字符的编码,故不需要ch=fgetc(fp);
fprintf(fp3,"%c",F->data);
F=T; //再让F指向T的根,翻译下一个字符
}
}
else
{
if(F->rchild) {F=F->rchild;ch=fgetc(fp2);}
else
{
printf("%c",F->data);
fprintf(fp3,"%c",F->data);
F=T;
}
}
}
printf("该文章已存入文件myfile3中。");
}
/*****************************************************************************************************************
end...
*****************************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -