📄 demonstration.c
字号:
#include "huffman.h"
/*在子函数中定义的数组也是在栈上分配空间的。所以同普通局部变量一样,当函数调用返回后其
内存空间就会被释放,不存在了不能再被使用。
在主调函数中定义的数组,通过把数组名作为形参传递可以在其子调函数中被使用及修改数组元素的值。
要理解这一点! 2006-11-05
*/
/*-------------------------------------------------------------------------------*/
//哈夫曼编码算法完整演示(包括创建文件,加解密,编译码,打印文件)
/*通信系统模块顺序:加密,编码,译码,解密。*/
void DemonstrateHuffmanArithmetic(void)
{
char filename[30]; //存放原始数据文件名
char filename1[30];//存放加密数据名
char filename2[30];//存放编码数据名
char filename3[30];//存放译码数据名
char filename4[30];//存放解密数据名
char string[30];
FILE* fp1;
FILE* fp2;
HuffmanTree T; //哈夫曼树T(数组),有M个元素
HuffmanCodeTable H; //哈夫曼编码表H(数组),有N个元素(对应N个字符或N个叶子结点)
//创建一个数据文件DATAFILE:
printf("\nStep 1 - Create a initial data file.\n");
printf("Input the filename(eg:DATAFILE) to create a initial data file:");
gets(string);
strcpy(filename,string);
create_data_file(filename);
printf("Print the initial data file.\n");
print(filename); //打印文件内容,供观察算法的实验结果用
//对原始数据文件DATAFILE进行加密得到加密文件ENCRYPT_DATAFILE:
printf("\nStep 2 - Encrypt the initial data file.\n");
printf("\nInput the filename(eg:ENCRYPT_DATAFILE) to save encrypting results:");
gets(string);
strcpy(filename1,string);
fp1 = fopen(filename,"rb");
fp2 = fopen(filename1,"wb");
encrypt(fp1,fp2);
printf("Print the encrypted file.\n");
print(filename1); //打印文件内容,供观察算法的实验结果用
//对(加密)数据文件进行Huffman编码,得到编码文件ENCODE_DATAFILE:
printf("\nStep 3 - Encode the encrypted file.\n");
printf("\nInput the filename(eg:ENCODE_DATAFILE) to save encoding results:");
gets(string);
strcpy(filename2,string);
CreateHuffmanTree(T,filename1);//由文件filename1构造哈夫曼树T
SetHuffmanEncodeTable(T,H);//根据哈夫曼树T求哈夫曼编码表H
if((fp1 = fopen(filename1,"rb")) == NULL){
printf("File %s NOT exist !\n",filename1);
printf("The program will exit later !\n");
exit(1);
}
if((fp2 = fopen(filename2,"wb")) == NULL){
printf("File %s NOT exist !\n",filename2);
printf("The program will exit later !\n");
exit(1);
}
while(1){
if((HuffmanEncode(H,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
printf("Print the Huffman-encoded file.\n");
print(filename2); //打印文件内容,供观察算法的实验结果用
//对已编码(Huffman编码)文件进行Huffman译码,得到译码文件DECODE_DATAFILE:
printf("\nStep 4 - Decode the encoded file.\n");
printf("\nInput the filename(eg:DECODE_DATAFILE) to save decoding results:");
gets(string);
strcpy(filename3,string);
if((fp1 = fopen(filename2,"rb")) == NULL){
printf("File %s NOT exist !\n",filename1);
printf("The program will exit later !\n");
exit(1);
}
if((fp2 = fopen(filename3,"wb")) == NULL){
printf("File %s NOT exist !\n",filename2);
printf("The program will exit later !\n");
exit(1);
}
while(1){
if((HuffmanDecode(T,H,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
printf("Print the Huffman-decoded file.\n");
print(filename3); //打印文件内容,供观察算法的实验结果用
//对加密文件进行解密
printf("\nStep 5 - Decrypt the decoded file.\n");
printf("\nInput the filename(eg:DECRYPT_DATAFILE) to save decrypting results:");
gets(string);
strcpy(filename4,string);
fp1 = fopen(filename3,"rb");
fp2 = fopen(filename4,"wb");
decrypt(fp1,fp2);
printf("Print the decrypted file.\n");
print(filename4); //打印文件内容,供观察算法的实验结果用
}
/*----------------------------------------------------------------------------------*/
//等长编码算法完整演示(包括创建文件,加解密,编译码,打印文件)
void DemonstrateEqualLengthCodeArithmetic(void)
{
char filename[30]; //存放原始数据文件名
char filename1[30];//存放加密数据名
char filename2[30];//存放编码数据名
char filename3[30];//存放译码数据名
char filename4[30];//存放解密数据名
char string[30];
FILE* fp1;
FILE* fp2;
EqualLengthCodeTable E;//等长码表E(数组),有N个元素(对应N个字符或N个叶子结点)
//创建一个数据文件DATAFILE:
printf("\nStep 1 - Create a initial data file.\n");
printf("Input the filename(eg:DATAFILE) to create a initial data file:");
gets(string);
strcpy(filename,string);
create_data_file(filename);
printf("Print the initial data file.\n");
print(filename); //打印文件内容,供观察算法的实验结果用
//对原始数据文件DATAFILE进行加密得到加密文件ENCRYPT_DATAFILE:
printf("\nStep 2 - Encrypt the initial data file.\n");
printf("\nInput the filename(eg:ENCRYPT_DATAFILE) to save encrypting results:");
gets(string);
strcpy(filename1,string);
fp1 = fopen(filename,"rb");
fp2 = fopen(filename1,"wb");
encrypt(fp1,fp2);
printf("Print the encrypted file.\n");
print(filename1); //打印文件内容,供观察算法的实验结果用
//对(加密)数据文件进行等长编码,得到编码文件ENCODE_DATAFILE:
printf("\nStep 3 - Encode the encrypted file.\n");
printf("\nInput the filename(eg:ENCODE_DATAFILE) to save encoding results:");
gets(string);
strcpy(filename2,string);
SetEqualLengthEncodeTable(E,filename1);//由文件filename1求得"等长编码表E"
if((fp1 = fopen(filename1,"rb")) == NULL){
printf("File %s NOT exist !\n",filename1);
printf("The program will exit later !\n");
exit(1);
}
if((fp2 = fopen(filename2,"wb")) == NULL){
printf("File %s NOT exist !\n",filename2);
printf("The program will exit later !\n");
exit(1);
}
while(1){
if((EqualLengthEncode(E,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
printf("Print the EqualLength-encoded file.\n");
print(filename2); //打印文件内容,供观察算法的实验结果用
//对已编码(等长编码)文件进行等长译码,得到译码文件DECODE_DATAFILE:
printf("\nStep 4 - Decode the encoded file.\n");
printf("\nInput the filename(eg:DECODE_DATAFILE) to save decoding results:");
gets(string);
strcpy(filename3,string);
if((fp1 = fopen(filename2,"rb")) == NULL){
printf("File %s NOT exist !\n",filename1);
printf("The program will exit later !\n");
exit(1);
}
if((fp2 = fopen(filename3,"wb")) == NULL){
printf("File %s NOT exist !\n",filename2);
printf("The program will exit later !\n");
exit(1);
}
while(1){
if((EqualLengthDecode(E,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
printf("Print the EqualLength-decoded file.\n");
print(filename3); //打印文件内容,供观察算法的实验结果用
//对加密文件进行解密
printf("\nStep 5 - Decrypt the decoded file.\n");
printf("\nInput the filename(eg:DECRYPT_DATAFILE) to save decrypting results:");
gets(string);
strcpy(filename4,string);
fp1 = fopen(filename3,"rb");
fp2 = fopen(filename4,"wb");
decrypt(fp1,fp2);
printf("Print the decrypted file.\n");
print(filename4); //打印文件内容,供观察算法的实验结果用
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -