?? main.c
字號(hào):
#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(數(shù)組),有M個(gè)元素
HuffmanCodeTable H; //哈夫曼編碼表H(數(shù)組),有N個(gè)元素(對(duì)應(yīng)N個(gè)字符或N個(gè)葉子結(jié)點(diǎn))
EqualLengthCodeTable E;//等長碼表E(數(shù)組),有N個(gè)元素(對(duì)應(yīng)N個(gè)字符或N個(gè)葉子結(jié)點(diǎn))
printf("\n%s%s%s%s%s%s%s%s%s%s%s%s\n",
"Choices List:\n",
"1:創(chuàng)建一個(gè)原始數(shù)據(jù)文件\n",
"2:對(duì)(加密)數(shù)據(jù)文件進(jìn)行Huffman編碼\n",
"3:對(duì)已編碼(Huffman編碼)文件進(jìn)行Huffman譯碼\n",
"4:對(duì)(加密)數(shù)據(jù)文件進(jìn)行等長編碼\n",
"5:對(duì)已編碼(等長編碼)文件進(jìn)行等長譯碼\n",
"6:對(duì)原始數(shù)據(jù)文件進(jìn)行加密\n",
"7:對(duì)加密文件進(jìn)行解密\n",
"8:打印指定文件名的文件內(nèi)容\n",
"9:哈夫曼編碼算法完整演示(包括創(chuàng)建文件,編譯碼,加解密,打印文件)\n",
"0:等長編碼算法完整演示(包括創(chuàng)建文件,編譯碼,加解密,打印文件)\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': //創(chuàng)建一個(gè)原始數(shù)據(jù)文件
FLAG = 1;
printf("\nInput the filename(eg:DATAFILE) :");
gets(string);
strcpy(filename,string);
create_data_file(filename);
break;
case '2': //對(duì)(加密)數(shù)據(jù)文件進(jìn)行Huffman編碼
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//輸入兩個(gè)文件名,并打開文件
CreateHuffmanTree(T,filename);//由文件filename的字符頻度分析構(gòu)造哈夫曼樹T
SetHuffmanEncodeTable(T,H);//根據(jù)哈夫曼樹T求哈夫曼編碼表H
while(1){//由哈夫曼編碼表H進(jìn)行文件的Huffman編碼
if((HuffmanEncode(H,fp1,fp2)) == '\0')//'\0'標(biāo)記讀完文件;文件所有字符都完成編碼
break;
}
fclose(fp1);
fclose(fp2);
break;
case '3': //對(duì)已編碼(Huffman編碼)文件進(jìn)行Huffman譯碼
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//輸入兩個(gè)文件名,并打開文件
/*輸入與已編碼文件filename對(duì)應(yīng)的原始數(shù)據(jù)(若對(duì)原始數(shù)據(jù)文件加密,則為加密文件)文件名filename2,以便
求出Huffman樹T及Huffman編碼表H,因?yàn)橐玫絋及H來進(jìn)行Huffman譯碼。*/
printf("Input the filename which is encoded to file %s:",filename);
gets(string);
strcpy(filename2,string);
CreateHuffmanTree(T,filename2);//由文件filename2的字符頻度分析構(gòu)造哈夫曼樹T
SetHuffmanEncodeTable(T,H);//根據(jù)哈夫曼樹T求哈夫曼編碼表H
while(1){ //由Huffman樹T及Huffman編碼表H進(jìn)行文件的Huffman譯碼
if((HuffmanDecode(T,H,fp1,fp2)) == '\0')//'\0'標(biāo)記讀完文件;文件所有字符都完成編碼
break;
}
fclose(fp1);
fclose(fp2);
break;
case '4': //對(duì)(加密)數(shù)據(jù)文件進(jìn)行等長編碼
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2); //輸入兩個(gè)文件名,并打開文件
SetEqualLengthEncodeTable(E,filename);//由文件filename求得"等長編碼表E"
while(1){//由"等長編碼表E"進(jìn)行等長編碼
if((EqualLengthEncode(E,fp1,fp2)) == '\0')//'\0'標(biāo)記讀完文件;文件所有字符都完成編碼
break;
}
fclose(fp1);
fclose(fp2);
break;
case '5': //對(duì)已編碼(等長編碼)文件進(jìn)行等長譯碼
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//輸入兩個(gè)文件名,并打開文件
/*輸入與已編碼文件filename對(duì)應(yīng)的原始數(shù)據(jù)(若對(duì)原始數(shù)據(jù)文件加密,則為加密文件)文件名filename2,以便
求出等長編碼表E,因?yàn)橐玫紼來進(jìn)行等長譯碼。*/
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'標(biāo)記讀完文件;文件所有字符都完成編碼
break;
}
fclose(fp1);
fclose(fp2);
break;
case '6': //對(duì)原始數(shù)據(jù)文件進(jìn)行加密
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//輸入兩個(gè)文件名,并打開文件
encrypt(fp1,fp2);
fclose(fp1);
fclose(fp2);
break;
case '7': //對(duì)加密文件進(jìn)行解密
FLAG = 1;
InputTwoFileName(filename,filename1,fp1,fp2);//輸入兩個(gè)文件名,并打開文件
decrypt(fp1,fp2);
fclose(fp1);
fclose(fp2);
break;
case '8': //打印指定文件名的文件內(nèi)容
FLAG = 1;
printf("\nInput the filename(eg:DATAFILE) to print:");
gets(string);
strcpy(filename,string);
print(filename);
break;
case '9': //哈夫曼編碼算法完整演示(包括創(chuàng)建文件,編譯碼,加解密,打印文件)
FLAG = 1;
DemonstrateHuffmanArithmetic();
break;
case '0': //等長編碼算法完整演示(包括創(chuàng)建文件,編譯碼,加解密,打印文件)
FLAG = 1;
DemonstrateEqualLengthCodeArithmetic();
break;
case 'e': //退出程序
FLAG = 1;
printf("The program will exit later !\n");
exit(1);
break;
default: //剛才輸入選擇無效;再進(jìn)行一次有效的選擇
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;
}
}
}
/*通信系統(tǒng)模塊順序:加密,編碼,譯碼,解密。*/
/*涉及到的各種文件名:DATAFILE,ENCRYPT_DATAFILE,DECRYPT_DATAFILE,
ENCODE_DATAFILE,DECODE_DATAFILE
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -