哈弗曼編譯碼課程設(shè)計_第1頁
哈弗曼編譯碼課程設(shè)計_第2頁
哈弗曼編譯碼課程設(shè)計_第3頁
哈弗曼編譯碼課程設(shè)計_第4頁
哈弗曼編譯碼課程設(shè)計_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

課程設(shè)計課程設(shè)計名稱:哈夫曼編/譯碼器

專業(yè)班級:學(xué)生姓名:號:指導(dǎo)教師:課程序設(shè)計時間:目錄TOC\o"1-5"\h\z\o"CurrentDocument"設(shè)計目的3需求分析3問題描述系統(tǒng)的基本組成部分,以及組成部分的要求概要設(shè)計3哈夫曼樹的數(shù)據(jù)結(jié)構(gòu)及哈夫曼樹的初始化對文件中的字符進行編碼過程對文件中的代碼進行譯碼印代碼文件(Print)印哈夫曼樹(TreePrinting)TOC\o"1-5"\h\z\o"CurrentDocument"詳細設(shè)計51.對模塊的具體程序?qū)崿F(xiàn)\o"CurrentDocument"調(diào)試與測試分析7調(diào)試測試\o"CurrentDocument"總結(jié)和心得9哈夫曼編碼/譯碼器.設(shè)計目的1?了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨立分析和設(shè)計能力;初步掌握程序設(shè)計過程中的結(jié)構(gòu)化程序設(shè)計的一般方法,及數(shù)據(jù)類型在設(shè)計中的應(yīng)用。能夠利用所學(xué)的基本知識和技能,解決簡單的程序設(shè)計問題;培養(yǎng)了我們的團隊合作精神,培養(yǎng)了我們對高級語言的編寫能力,從而提高我們的編程綜合能力。需求分析問題描述.利用哈夫曼編碼進行信息通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來的數(shù)據(jù)進行譯碼(復(fù)原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼編/譯碼系統(tǒng)。.哈夫曼編/譯碼系統(tǒng)由以下幾個部分組成:1)I:初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個權(quán)值,建立哈夫曼樹,并將它存于文件hfmTree中。2)E:編碼(Encoding)。利用已建好的哈夫曼樹(如不在內(nèi)存,則從文件htmTree中讀入),對文件ToBeTran中的正文進行編碼,然后將結(jié)果存入文件CodeFile中。3)D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結(jié)果存入文件TextFile中。4)P:印代碼文件(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼寫入文件CodePrint中。5)T:印哈夫曼樹(TreePrinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。概要設(shè)計1.構(gòu)建哈夫曼樹.按輸入的字符數(shù)據(jù)和相應(yīng)的權(quán)值,建立哈夫曼樹。并保存到相應(yīng)的文件中。哈夫曼樹的結(jié)構(gòu)為:structhftree{intweight;〃為字符的權(quán)值大小intparent;//根節(jié)點intIchild;//左孩子intrchild;〃右孩子};構(gòu)建哈夫曼樹的算法如下:Q初始化葉子節(jié)點:根據(jù)給定的n個權(quán)值構(gòu)成的n個葉子節(jié)點的集合F,其中每棵二叉樹只有一個帶權(quán)的根節(jié)點,其左右子樹為空Q在F中選取兩棵權(quán)值最小的節(jié)點作為左右子樹構(gòu)造一棵新的節(jié)點,且置新的節(jié)點的根節(jié)點的權(quán)值為兩棵權(quán)值最小的節(jié)點的權(quán)值之和。新的節(jié)點的左右孩子的值為兩棵權(quán)值最小的節(jié)點下標,下標小的在左子樹、大的在右子樹。Q在F中將父節(jié)點置為2中新加節(jié)的的下標,同時將新得到的二叉樹加入到F中。重復(fù)QQ,直到f中只有一顆父節(jié)點為0的樹。這棵樹便是哈夫曼樹。將構(gòu)建好的哈夫曼樹保存到hfmTree文件中,以供編碼譯碼時采用文件調(diào)用的方式調(diào)用它。編碼操作在收到編碼操作請求時,調(diào)用TextToCode(constcodetable*codetal,constchar*str_text)函數(shù),將字符串str_text編碼。算法設(shè)計思想如下:由于我們之前已經(jīng)利用將各個字符及其所對應(yīng)的編碼存到了CT數(shù)組中所以編碼時在CT數(shù)組中直接找到該字符,將該字符的編碼加到str_code后面,直到將所有的字符都完成編碼。3譯碼操作算法設(shè)計思想如下:對所有的26個英文字符及空格字符,用它們相對應(yīng)的頻數(shù)作為權(quán)值,構(gòu)建一個哈夫曼樹存儲起來。當(dāng)接收到控制端有譯碼操作時,調(diào)用現(xiàn)存的哈夫曼樹譯碼的過程是分解字符串,從根節(jié)點出發(fā),按字符“0”或“1”確定找左孩子還是右孩子,直至葉子節(jié)點,便求的該子串相應(yīng)的字符。在每次譯碼時只要找到了一個葉子節(jié)點(即我們要得到的字符),下次就應(yīng)該再次從根節(jié)點出發(fā)。4.印代碼文件將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼寫入文件CodePrint中。5.印哈夫曼樹調(diào)用TreePrinting()函數(shù)將樹顯示在屏幕上,并存到文件中將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。算法設(shè)計思想:Q首先得到樹的高度tree_heighQfor(i=0;i<tree_heigh;i++)Q當(dāng)i==0時將樹的根結(jié)點寫到cur數(shù)組中,若i!=0,先調(diào)用Assign()函數(shù)利用cur數(shù)組給pre數(shù)組賦值;再調(diào)用GetValue()函數(shù)利用pre數(shù)字來得到cur數(shù)組,具體設(shè)計思想為:如果pre[i]的左右孩子都為0,說明到了葉子節(jié)點或則該節(jié)點是一個虛節(jié)點,則將cur[j]的字符段賦為空,父節(jié)點、左右孩子賦為0°4將cur數(shù)組打印到屏幕上,并寫入到TreePrint文件中詳細設(shè)計#include<stdio.h>#include<tchar.h>#include<io.h>/*判斷文件是否存在的函數(shù)所需的頭文件*/#include<cmath>#include<iostream>#include<string>usingnamespacestd;#defineLENGTH20#defineNUMBER100#defineMAX_LEN100typedefintweight_type;structhftree(charch;weight_typeweight;intparent;intlchild;intrchild;};structcodetable(charch;charcodes[LENGTH];//stringcodes;};intchar_num=0;//輸入字符的個數(shù)intcur_num=0;//當(dāng)前樹中節(jié)點的個數(shù)inttree_heigh=0;//樹的層數(shù)hftree*HT=NULL;codetable*CT=NULL;/*數(shù)據(jù)輸入函數(shù)*/voidDateIn()(fflush(stdin);printf(-請輸入要進行編碼的數(shù)量:\t〃);scanf(〃%d〃,&char_num);fflush(stdin);cur_num=char_num;HT=(hftree*)malloc((char_num*2-1)*sizeof(hftree));if(!HT)(printf("內(nèi)存分配失敗!\n");exit(-1);}/*分配哈弗曼樹的存儲空間*/for(inti=0;i<char_num;i++)(printf("請輸入第(^個字符及其權(quán)值回車結(jié)束本次輸入:〃,i);scanf("%c%d",&HT[i].ch,&HT[i].weight);HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;fflush(stdin);}}/*查找最小及次小的權(quán)值*/voidSearch(consthftree*p,int&min,int&second)(boolnot_find;inti,min_set,sec_set,mini_weight;min_set=0;sec_set=0;for(intcount=0;count<2;count++)(not_find=true;if(0==count)(for(i=0;i<cur_num;i++)(if(0==p[i].parent)(if(not_find)(mini_weight=p[i].weight;min_set=i;not_find=false;}else(if(p[i].weight<=mini_weight)(mini_weight=p[i].weight;min_set=i;}}}}}else(for(i=0;i<cur_num;i++)(if(0==p[i].parent&&i!=min_set)(if(not_find)(mini_weight=p[i].weight;sec_set=i;not_find=false;}else(if(p[i].weight<=mini_weight)(mini_weight=p[i].weight;sec_set=i;}}}}}}min=min_set;second=sec_set;/*顯示哈弗曼樹*/voidShowTree(consthftree*p)(inti;printf(-根據(jù)輸入的字符及其權(quán)值所得到的哈夫曼樹如下:\n〃);printf(〃%-8s%-8s%-8s%-8s%-8s\n〃,〃char〃,〃weight〃,〃parent〃,〃lchild,"rchild");for(i=0;i<cur_num;i++)(printf(〃%-8c%-8d%-8d%-8d%-8d\n〃,p[i].ch,p[i].weight,p[i].parent,p[i].lchild,p[i].rchild);}printf(〃\n〃);}/*得到哈夫曼樹的高度*/voidGetTreeHgh(constcodetable*p)(inti,len;for(i=0;i<char_num;i++)(len=strlen(p[i].codes);if(len>tree_heigh)(tree_heigh=len;}}tree_heigh+=1;}/*顯示字符及其編碼*/voidShowCodTal(constcodetable*p)(inti;cout<<"各個字符所對應(yīng)的編碼如下:〃<<endl;printf(〃%-8s\t%-8s\n〃,〃char〃,〃codes〃);for(i=0;i<char_num;i++)(cout<<p[i].ch<<""<<p[i].codes<<endl;}}/*顯示菜單*/voidShowMenu()(cout<<"****************************************"<<endl;cout<<"****菜單****"<<endl;cout<<"**1、I:初始化(Initialization)**"<<endl;cout<<"**2、E:編碼(Encoding)**"<<endl;cout<<"**3、D:譯碼(Decoding)**"<<endl;cout<<"**4、P:印代碼文件(Print)**"<<endl;cout<<"**5、T:印哈夫曼樹(TreePrinting)**"<<endl;cout<<"**6、C:清屏(ClearScreep)**"<<endl;cout<<"**7、Q:退出系統(tǒng)(ExitSystem)**"<<endl;cout<<"****************************************"<<endl;}/*構(gòu)建哈夫曼樹*/voidCreateTree(hftree*p)(intmin,second,i,temp;for(i=0;i<char_num-1;i++)(Search(p,min,second);/*將目前樹中最后一個的下標賦給權(quán)值最小及次小的父節(jié)點;*/p[min].parent=p[second].parent=cur_num;if(min>second)(temp=min;min=second;second=temp;}p[cur_num].ch='0';/*將最小、次小的權(quán)值所對應(yīng)的下標最小的賦給最后一個單元的左孩子;*/p[cur_num].lchild=min;/*將最小、次小的權(quán)值所對應(yīng)的下標次小賦給最后一個單元的右孩子;*/p[cur_num].rchild=second;/*將最后一個單元的雙親賦為;*/p[cur_num].parent=0;/*將最后一個單元的權(quán)值賦為最小及次小下標所在單元的權(quán)值之和*/p[cur_num].weight=p[min].weight+p[second].weight;cur_num++;}}/*將字符串首尾置換*/voidReverse(char(*s)[LENGTH])(inti,j;chartemp;intlength;for(i=0;i<char_num;i++)(length=strlen(s[i]);if(length>2)(for(j=0;j<length/2;j++)(temp=s[i][j];s[i][j]=s[i][length-1-j];s[i][length-1-j]=temp;}}elseif(length==2)(temp=s[i][0];s[i][0]=s[i][1];s[i][1]=temp;}}}/*從終端輸入一串字符串,并寫入到ToBeTran文件中*/stringReadTextFromCon()(cout<<"現(xiàn)在請輸入要編碼的文本字符串:〃;fflush(stdin);charstr[MAX_LEN];gets(str);fflush(stdin);FILE*fp=fopen(〃ToBeTran〃,〃wb〃);if(!fp)(printf("ReadTextFromFile函數(shù)在打開ToBeTran文件錯誤!\n〃);exit(-1);}fprintf(fp,〃%s〃,str.c_str());fclose(fp);strings;s=str;returns;}/*從ToBeTran文件中讀取要進行編碼的文本數(shù)據(jù)到內(nèi)存*/stringReadTextFromFile()(stringstr_text;charch;inti=0;/*判斷ToBeTran文件是否存在,若不存在,則提示用戶從終端輸入*/if(_access("ToBeTran",0)!=0)(printf("對不起!ToBeTran文件不存在,請從終端輸入后再進行操作--\n〃);str_text=ReadTextFromCon();returnstr_text;}FILE*fp=fopen(〃ToBeTran〃,〃rb〃);if(!fp)(printf("ReadTextFromFile函數(shù)在打開ToBeTran文件錯誤!\n〃);exit(-1);}while((ch=fgetc(fp))!=EOF)(str_text+=ch;}fclose(fp);returnstr_text;}/*從文件中初始化哈夫曼樹*/voidInitTree()(inti;hftreetemp;/*從文件中讀取char_num*/FILE*fp_read_num=fopen(〃NumText〃,〃rb〃);if(!fp_read_num)(printf("打開NumText文件失??!\n");exit(-1);}fscanf(fp_read_num,"%d",&char_num);fclose(fp_read_num);cur_num=2*char_num-1;/*分配哈弗曼樹的存儲空間*/HT=(hftree*)malloc((char_num*2-1)*sizeof(hftree));if(!HT)(printf("內(nèi)存分配失敗!\n");exit(-1);}/*從hfmTree文件中讀取哈夫曼樹*/FILE*fp_read_tree=fopen(〃hfmTree〃,〃rb〃);if(!fp_read_tree)(printf("InitTree函數(shù)打開hfmTree文件失??!\n〃);exit(-1);}i=0;while(!feof(fp_read_tree))(if(NULL==fread(&temp,sizeof(hftree),1,fp_read_tree))(break;}HT[i++]=temp;}fclose(fp_read_tree);}/*哈弗曼編碼*/voidCodeing(consthftree*p,char(*s)[LENGTH])(intset=0;intj,i,temp;for(i=0;i<char_num;i++)(set=i;j=0;while(0!=p[i].parent)(temp=i;i=p[i].parent;if(temp==p[i].lchild)(s[set][j++]='0';}else(s[set][j++]='1';}}s[set][j]='\0';i=set;}Reverse(s);}/*創(chuàng)建各字符對應(yīng)的編碼表*/voidCreCodeTal(consthftree*p,constchar(*s)[LENGTH])(CT=(codetable*)malloc(sizeof(codetable)*char_num);inti;for(i=0;i<char_num;i++)(CT[i].ch=p[i].ch;//CT[i].codes=s[i];strcpy(CT[i].codes,s[i]);}}/*將各字符對應(yīng)的編碼表寫入CodeTabFile文件*/voidWriteCodeTableToFile(constcodetable*codetals)(inti;FILE*fp=fopen(〃CodeTabFile〃,〃wb〃);if(!fp)(printf("WriteCodeTableToFile函數(shù)中CodeTabFile文件打開出錯!\n");exit(-1);}for(i=0;i<cur_num;i++)(fwrite(&codetals[i],sizeof(codetable),1,fp);}fclose(fp);}/*從終端讀取要進行編碼的文本并寫到ToBeTran文件*/voidWriteTextToFile(constchar*str,constchar*filename)(FILE*fp=fopen(filename,〃wb〃);if(!fp)(printf("WriteTextToFile函數(shù)在%‘文件打開錯誤!\n”,filename);exit(-1);}fprintf(fp,"%s",str);printf("恭喜您,%s文件寫入成功!\n”,filename);fclose(fp);}/*將輸入的編碼字符的個數(shù)寫到文件*/voidWriteNumToFile(intnumber)(FILE*fp=fopen("NumText","wb");if(!fp)(printf("WriteNumToFile函數(shù)在NumText文件打開錯誤!");exit(-1);}fprintf(fp,"%d",number);fclose(fp);}/*將哈弗曼樹寫入文件*/voidWriteHfTreeToFile(consthftree*p)(inti;FILE*fp=fopen("hfmTree","wb");if(!fp)(printf("WriteHfTreeToFile函數(shù)中hfmTree文件打開失敗!\n");exit(-1);}for(i=0;i<cur_num;i++)(if(1!=fwrite(&p[i],sizeof(hftree),1,fp))(printf("Initialization函數(shù)中hfmTree文件寫入錯誤!");exit(-1);}}fclose(fp);}/*將文本字符由哈弗曼編碼算法編碼成二進制字符串、*/stringTextToCode(constcodetable*codetal,constchar*str_text)(stringstr_code,temp;inti,set,length;charch;length=strlen(str_text);for(i=0;i<length;i++)(ch=str_text[i];if(ch>='a'&&ch<='z')(ch-=32;}if(ch>='A'&&ch<='Z'||''==ch)(if(''==ch)(temp=codetal[0].codes;}else(set=ch-'A'+1;temp=codetal[set].codes;}str_code+=temp;}else(printf("文本中存在非法字符!\n");exit(-1);}}returnstr_code;}/*將編碼文件翻譯成字符*/stringCodeToText(consthftree*p,constchar*str_code)intlen,i,set;stringstr_text;len=strlen(str_code);set=cur_num-1;for(i=0;i<len;)(while(p[set].lchild!=p[set].rchild)(if('0'==str_code[i])(set=p[set].lchild;i++;}elseif('1'==str_code[i])(set=p[set].rchild;i++;}else(printf("文本中存在非法字符!\n");exit(-1);}}str_text+=p[set].ch;set=cur_num-1;}returnstr_text;}/*用HT數(shù)組(cur)對HT數(shù)組(pre)賦值*/voidAssign(hftree*des,consthftree*source,constintcount)(inti;for(i=0;i<count;i++)(des[i]=source[i];}}/*得到cur(current)數(shù)組所需的值*/voidGetValue(hftree*des,consthftree*source,constintcount)(inti,j,left,right;j=0;for(i=0;i<count;i++)(left=source[i].lchild;right=source[i].rchild;if(0==left&&0==right)(des[j].ch='\0';des[j].weight=0;des[j].parent=0;des[j].lchild=0;des[j].rchild=0;j++;des[j].ch='\0';des[j].weight=0;des[j].parent=0;des[j].lchild=0;des[j].rchild=0;j++;}else(des[j++]=HT[left];des[j++]=HT[right];}}}/*從終端輸入字符及其權(quán)值并將建立好的哈夫曼樹寫入文件*/voidInitialization。(charstr[NUMBER][LENGTH];/*臨時存儲編碼的數(shù)組*/DateIn();/*從終端讀入字符集大小n,以及n個字符和n個權(quán)值*/WriteNumToFile(char_num);CreateTree(HT);Codeing(HT,str);CreCodeTal(HT,str);WriteHfTreeToFile(HT);}/*利用對哈夫曼樹對文本進行編碼并存入到文件*/voidEncoding()

stringstr_text,str_code;str_text=ReadTextFromFile();//將要編碼的文件讀出str_code=TextToCode(CT,str_text.c_str());/*利用已建立好的編碼表編碼*/cout<<"文本串為〃<<str_text<<〃經(jīng)編碼后如下:"<<endl;cout<<str_code<<endl;WriteTextToFile(str_code.c_str(),〃CodeFile〃);//將編碼串寫到文件}/*利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結(jié)果存入文件TextFile中*/voidDecoding()(/*如果CodeFile文件不存在*/if(_access("CodeFile",0)!=0)(printf("對不起,你所需要的CodeFile文件不存在!請先創(chuàng)建CodeFile文件\n〃);return;}FILE*fp=fopen(〃CodeFile〃,〃rb〃);if(!fp)(printf("Decoding函數(shù)打開CodeFile文件失敗\n〃);exit(-1);}char*str_code;intfile_len;fseek(fp,0L,SEEK_END);file_lenfseek(fp,0L,SEEK_END);file_len=ftell(fp);fseek(fp,0L,SEEK_SET);〃得到文件的長度,便于動態(tài)分配空間〃將文件指針移到文件開始,便于以后讀取str_code=newchar[file_len+1];fscanf(fp,"%s",str_code);〃從CodeFile文件中讀出所有字符串存到str_codefclose(fp);stringstr_text;str_text=CodeToText(HT,str_code);/*譯碼*/cout<<"源碼為:〃<<str_code<<〃的編碼串經(jīng)譯碼后的文本如下"<<endl;cout<<"譯碼后的文本為:"<<str_text<<endl;WriteTextToFile(str_text.c_str(),〃TextFile〃);/*將文件CodeFile顯示在終端上,同時將此字符形式的編碼寫入文件CodePrint中*/voidPrint()(if(_access("CodeFile",0)!=0)(printf("對不起,你所需要的CodeFile文件不存在!請先創(chuàng)建CodeFile文件\n〃);return;}FILE*fp_code=fopen(〃CodeFile〃,〃rb〃);if(!fp_code)(printf("Print函數(shù)打開CodeFile文件失敗\n〃);exit(-1);}charch;inti=0;FILE*fp=fopen(〃CodePrint〃,〃wb〃);if(!fp_code)(printf("Print函數(shù)打開CodePrint文件失敗\n〃);exit(-1);}while(!feof(fp_code))(fscanf(fp_code,〃%c〃,&ch);if(NULL==ch)(break;}i++;cout<<ch;if(i%50==0)(cout<<endl;}fprintf(fp,"%c",ch);}printf(〃\n〃);printf("恭喜您,CodePrint文件寫入成功!\n");fclose(fp_code);fclose(fp);}/*印哈夫曼樹(TreePrinting)將此字符形式的哈夫曼樹寫入文件TreePrint中*/voidTreePrinting()(inti,pre_node,cur_node,floor,max_node;hftree*pre;hftree*cur;pre_node=0;cur_node=0;max_node=(int)pow((float)2,tree_heigh-1);pre=newhftree[max_node];cur=newhftree[max_node];FILE*fp;fp=fopen(〃TreePrint〃,〃wb〃);if(!fp)(printf("TreePrint文件打開失??!\n");exit(-1);}for(floor=0;floor<tree_heigh;floor++)(pre_node=cur_node;cur_node=(int)pow((float)2,(int)floor);if(0==floor)(cur[0]=HT[cur_num-1];}else(Assign(pre,cur,pre_node);GetValue(cur,pre,(int)pow((float)2,floor-1));}for(i=0;i<cur_node;i++)(printf("%-4d",cur[i].weight);fscanf(fp,〃%-4d〃,&cur[i].weight);}printf("\n");fprintf(fp,〃\n〃);fclose(fp);}int_tmain(intargc,_TCHAR*argv[])(charch;/*如果hfmTree文件存在,就利用hfmTree文件來初始化HT,CT*/if(0==_access("hfmTree",0))(/*調(diào)用InitTree()后,全局變量HT,char_num,cur_num都將加載到內(nèi)存*/InitTree();ShowTree(HT);charstr[NUMBER][LENGTH];/*臨時存儲編碼的數(shù)組*/Codeing(HT,str);/*利用已經(jīng)建立好的哈夫曼樹進行編碼*//*調(diào)用CreCodeTal()后全局變量CT(各字符對應(yīng)的編碼表)將加載到內(nèi)存*/CreCodeTal(HT,str);ShowCodTal(CT);GetTreeHgh(CT);cout<<"樹的層數(shù)為:"<<tree_heigh<<endl;}ShowMenu();do(cout<<"請輸入你想要進行的操作:〃;fflush(stdin);cin>>ch;switch(ch)('?'一casei:caseI:Initialization。;ShowTree(HT);break;casee:caseE:Encoding();break;case'd':case'D':Decoding();break;,,一casep:caseP:Print();break;caset:case1:TreePrinting();break;casec:caseC:system("cls");ShowMenu();break;caseq:case'Q':printf("你已經(jīng)成功退出系統(tǒng)!\n");break;default:printf("對不起沒有此菜單項,請重新輸入!\n");break;}}while('Q'!=ch&&'q'!=ch);system(〃pause〃);return0;}調(diào)試和測試分析°1在進行文件操作時,判斷文件是否已經(jīng)到達文件的結(jié)尾是一個非常重要的細節(jié),如果只是簡單的調(diào)用feof()函數(shù)在很多情況下是不能達到設(shè)計者所想要得到的結(jié)果的,調(diào)試過程中發(fā)現(xiàn)簡單的調(diào)用feof()函數(shù),程序會多讀出一個結(jié)果,而這個結(jié)果我們在寫入時并沒有寫,因此它是一個不確定的值。之所以會出現(xiàn)這個現(xiàn)象是因為一個字符串輸入完畢以后,在關(guān)閉文件時系統(tǒng)將自動在最后加上一個“-1”字節(jié)作為文件結(jié)束的標志。在讀入文件時,每讀一個字符可以測試一次feof函數(shù)的值。在讀完最后一個字符時候,feof函數(shù)的值仍然為0,在讀如最后一個字節(jié),也就七1”字節(jié)的時候eof才為1,所以會多一個字符。解決辦法是:當(dāng)我們想要讀取一個值時,先讀到一個臨時空間保存,當(dāng)ch不為EOF是我們才在while循環(huán)中將ch讀到內(nèi)存形式為while((ch=fgetc(fp))!=EOF){…}Q判斷一個文件是否存在的函數(shù)access()頭文件:io.h功能:確定文件的訪問權(quán)限,檢查某個文件的存取方式,比如說是只讀方式、只寫方式等。如果指定的存取方式有效,則函數(shù)返回0,否則函數(shù)返回-1用法:intaccess(constchar^filename,intamode);int_access(constchar*path,intmode);access函數(shù),當(dāng)對文件使用時,判斷是否存在指定的文件,以及是否能夠按指定的模式進行訪問。當(dāng)對目錄使用時,只判斷是否存在指定的目錄;因為在Windows系統(tǒng)下所有的目錄都有讀和寫的訪問權(quán)限。參數(shù)mode可為以下的其中之一:00只存在02寫權(quán)限04讀權(quán)限06讀和寫權(quán)限返回值:如果文件擁有給定的模式則返回0,如果發(fā)生錯誤返回-1。Q當(dāng)我們利用哈夫曼樹建立相應(yīng)字符的編碼時,用char類型的參數(shù)總不太適合,因為事先無法知道編碼長度,而且又不能動態(tài)變長,而利用string類型可以很好的達到這個效果,但在函數(shù)調(diào)用時參數(shù)是constchar*類型,string又不能強制轉(zhuǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論