📄 main.c
字号:
#include "huffman.h"
void main(void)
{
int FLAG;
char ch;
char filename[30]; //放文件名
char filename1[30];
char filename2[30];
char string[30];
FILE* fp1 = NULL;
FILE* fp2 = NULL;
HuffmanTree T; //哈夫曼树T(数组),有M个元素
HuffmanCodeTable H; //哈夫曼编码表H(数组),有N个元素(对应N个字符或N个叶子结点)
EqualLengthCodeTable E;//等长码表E(数组),有N个元素(对应N个字符或N个叶子结点)
printf("\n%s%s%s%s%s%s%s%s%s%s%s%s\n",
"Choices List:\n",
"1:创建一个原始数据文件\n",
"2:对(加密)数据文件进行Huffman编码\n",
"3:对已编码(Huffman编码)文件进行Huffman译码\n",
"4:对(加密)数据文件进行等长编码\n",
"5:对已编码(等长编码)文件进行等长译码\n",
"6:对原始数据文件进行加密\n",
"7:对加密文件进行解密\n",
"8:打印指定文件名的文件内容\n",
"9:哈夫曼编码算法完整演示(包括创建文件,编译码,加解密,打印文件)\n",
"0:等长编码算法完整演示(包括创建文件,编译码,加解密,打印文件)\n",
"e: 退出程序\n");
RE_CHOICE:
printf("Input '0' - '9' or 'e' to make a choice :");
fflush(stdin);
ch = getchar();
FLAG = 0;
while(!FLAG){
switch(ch){
case '1': //创建一个原始数据文件
FLAG = 1;
printf("\nInput the filename(eg:DATAFILE) :");
gets(string);
strcpy(filename,string);
create_data_file(filename);
break;
case '2': //对(加密)数据文件进行Huffman编码
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//输入两个文件名,并打开文件
CreateHuffmanTree(T,filename);//由文件filename的字符频度分析构造哈夫曼树T
SetHuffmanEncodeTable(T,H);//根据哈夫曼树T求哈夫曼编码表H
while(1){//由哈夫曼编码表H进行文件的Huffman编码
if((HuffmanEncode(H,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
break;
case '3': //对已编码(Huffman编码)文件进行Huffman译码
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//输入两个文件名,并打开文件
/*输入与已编码文件filename对应的原始数据(若对原始数据文件加密,则为加密文件)文件名filename2,以便
求出Huffman树T及Huffman编码表H,因为要用到T及H来进行Huffman译码。*/
printf("Input the filename which is encoded to file %s:",filename);
gets(string);
strcpy(filename2,string);
CreateHuffmanTree(T,filename2);//由文件filename2的字符频度分析构造哈夫曼树T
SetHuffmanEncodeTable(T,H);//根据哈夫曼树T求哈夫曼编码表H
while(1){ //由Huffman树T及Huffman编码表H进行文件的Huffman译码
if((HuffmanDecode(T,H,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
break;
case '4': //对(加密)数据文件进行等长编码
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2); //输入两个文件名,并打开文件
SetEqualLengthEncodeTable(E,filename);//由文件filename求得"等长编码表E"
while(1){//由"等长编码表E"进行等长编码
if((EqualLengthEncode(E,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
break;
case '5': //对已编码(等长编码)文件进行等长译码
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//输入两个文件名,并打开文件
/*输入与已编码文件filename对应的原始数据(若对原始数据文件加密,则为加密文件)文件名filename2,以便
求出等长编码表E,因为要用到E来进行等长译码。*/
printf("Input the filename which is encoded to file %s:",filename);
gets(string);
strcpy(filename2,string);
SetEqualLengthEncodeTable(E,filename2);//由文件filename2求得"等长编码表E"
while(1){
if((EqualLengthDecode(E,fp1,fp2)) == '\0')//'\0'标记读完文件;文件所有字符都完成编码
break;
}
fclose(fp1);
fclose(fp2);
break;
case '6': //对原始数据文件进行加密
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//输入两个文件名,并打开文件
encrypt(fp1,fp2);
fclose(fp1);
fclose(fp2);
break;
case '7': //对加密文件进行解密
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//输入两个文件名,并打开文件
decrypt(fp1,fp2);
fclose(fp1);
fclose(fp2);
break;
case '8': //打印指定文件名的文件内容
FLAG = 1;
printf("\nInput the filename(eg:DATAFILE) to print:");
gets(string);
strcpy(filename,string);
print(filename);
break;
case '9': //哈夫曼编码算法完整演示(包括创建文件,编译码,加解密,打印文件)
FLAG = 1;
DemonstrateHuffmanArithmetic();
break;
case '0': //等长编码算法完整演示(包括创建文件,编译码,加解密,打印文件)
FLAG = 1;
DemonstrateEqualLengthCodeArithmetic();
break;
case 'e': //退出程序
FLAG = 1;
printf("The program will exit later !\n");
exit(1);
break;
default: //刚才输入选择无效;再进行一次有效的选择
FLAG = 0;
printf("Input '0' - '9' or 'e' to make a choice :");
fflush(stdin);
ch = getchar();
break;
}
}
printf("\nDo you want to make another choice ?\n");
printf("Input 'y' or 'n' to determine :");
fflush(stdin);
ch = getchar();
FLAG = 0;
while(!FLAG){
switch(ch){
case 'y':
FLAG = 1;
goto RE_CHOICE;
break;
case 'n':
FLAG = 1;
printf("The program will exit later !\n");
exit(1);
break;
default:
FLAG = 0;
printf("Input 'y' or 'n' to determine :");
fflush(stdin);
ch = getchar();
break;
}
}
}
/*通信系统模块顺序:加密,编码,译码,解密。*/
/*涉及到的各种文件名:DATAFILE,ENCRYPT_DATAFILE,DECRYPT_DATAFILE,
ENCODE_DATAFILE,DECODE_DATAFILE
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -