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 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< cout << endl;