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

📄 main.c

📁 自己用C编写的Huffman编码通信系统应用
💻 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 + -