哈夫曼压缩解压-数据结构设计报告 下载本文

for(int i=0; i

if(bitsnum!=0){ //处理最后未满8个字符的byte,用0填充并记录填充的个数 for(int i=bitsnum; i<8; i++) { addbit(0); lacknum++; } ofs.put(byte); resetbyte(); }

ofs.seekp(0,ios::beg); //将写指针移动到文件开头 ofs.put(lacknum); //写入最后一个字节缺失的bit个数 ifs.close(); ofs.close(); return true; }

//恢复函数 成功执行返回 true 失败 false

bool huffmanTree::decompress(char *input, char *output) {

queue q; char c;

ifstream ifs; ofstream ofs;

ifs.open(input,ios::binary); ofs.open(output,ios::binary); if(!ifs) { cout << \无法打开文件 \ return true; }

if(!ofs) { cout << \无法打开文件 \ return false; }

ifs.get(c);

lacknum = c; //读出最后一个字节缺失的bit个数 ifs.get(c);

root = c+384; //读出根结点的位置 for(int i=0; i

int point = root;

//为了方便处理最后一个可能有缺失bit的字节,先将读出的数据放入队列 while(ifs.get(c)) q.push(c);

//还原文件过程 while(q.size()>1)

{ //还未到最后一个字节 c = q.front(); for(int i=0; i<8; i++) { if(int(c&128)==0) { point = HT[point].lchild; if(HT[point].lchild==-1 && HT[point].rchild==-1) { ofs.put(char(point-128)); point = root; } c = c << 1; } else { point = HT[point].rchild; if(HT[point].lchild==-1 && HT[point].rchild==-1) { ofs.put(char(point-128)); point = root; } c = c << 1; } } q.pop(); }

c = q.front(); //最后一个字节 for(i=0; i<8-lacknum; i++) { if(int(c&128)==0) { point = HT[point].lchild; if(HT[point].lchild==-1 && HT[point].rchild==-1) { ofs.put(char(point-128)); point = root; } c = c << 1; } else{ point = HT[point].rchild; if(HT[point].lchild==-1 && HT[point].rchild==-1) { ofs.put(char(point-128)); point = root; } c = c << 1; } }

q.pop(); ifs.close(); ofs.close(); return true; }

//将原文件与压缩后的文件比较

void huffmanTree::compare(char *input, char *output) {

ifstream origin, compress; origin.open(input,ios::binary);

compress.open(output,ios::binary);

if(!origin) { cout << \无法打开文件 \ return; }

if(!compress) { cout << \无法打开文件 \ return; }

double total1=0, total2=0; char c;

while(origin.get(c)) total1++;

while(compress.get(c)) total2++;

cout << \原文件大小:\ cout << \压缩后大小:\ cout << \压缩率:\/total1*100 << '%' << endl; origin.close(); compress.close(); }

//将原文件与恢复后的文件比较

void huffmanTree::compare2(char *input, char *output) {

ifstream origin, decompress; origin.open(input,ios::binary);

decompress.open(output,ios::binary); double total1=0, total2=0; char c1, c2; bool dif = false;

while(origin.get(c1) && decompress.get(c2)) { if(c1!=c2) //依次比较每个字节,不同则将dif标志设为true dif = true; total1++; total2++; }

while(origin.get(c1))

{ //若原文件还有剩余的数据,将dif设为true dif = true; total1++; }

while(decompress.get(c2))

{ //若恢复文件还有剩余的数据,将dif设为true dif = true; total2++; }

cout << \原文件大小:\ cout << \恢复文件大小:\ if(dif==true) cout << \原文件与恢复文件不同!\ else cout << \原文件与恢复文件相同!\ origin.close();

decompress.close(); }

//##############################################################

//huffman.cpp

#include \

#include \

void main() {

int choice = 1;

char input[255], output[255]; huffmanTree h; while(choice) { cout<<\***************************************************\ cout<<\* 哈夫曼编码压缩恢复算法 *\ cout<<\* *\ cout<<\* 1)压缩 *\ cout<<\* *\ cout<<\* 2) 恢复 *\ cout<<\* *\ cout<<\* 3) 恢复文件与原文件的对比 *\ cout<<\* *\ cout<<\* 4) 清屏 *\ cout<<\* *\ cout<<\* 5) 退出 *\ cout<<\* *\ cout<<\* 说明:请您输入相应的操作序号进行操作 *\ cout<<\****************************************************\ cout<<\ cin >> choice; switch(choice) { case 1: { cout << \请输入待压缩的文件名:\ cin >> input; cout << \请输入压缩后的文件名:\ cin >> output; if( h.compress(input,output)) { h.printcode(); h.compare(input,output); cout<

} }

cin >> input; cout << \请输入恢复后的文件名:\ cin >> output; if (h.decompress(input,output)) cout<> input; cout << \请输入恢复文件的文件名:\ cin >> output; h.compare2(input,output); } break; case 4: { //执行清屏命令 system(\ } break; case 5: break; default: cout << \参数错误!请重新输入\}

cout << endl;