发布时间 : 星期一 文章用哈夫曼编码C语言实现文件压缩更新完毕开始阅读
if(min1>header[j].count) {
pt1=j;
min1=header[j].count; continue; } }
header[i].count+=header[pt1].count; header[i].rch=pt1; header[pt1].parent=i; }
for(i=0;i f=i; header[i].bits[0]=0; while(header[f].parent!=-1) { j=f; f=header[f].parent; if(header[f].lch==j) { j=strlen(header[i].bits); memmove(header[i].bits+1,header[i].bits,j+1); header[i].bits[0]='0'; } else { j=strlen(header[i].bits); memmove(header[i].bits+1,header[i].bits,j+1); header[i].bits[0]='1'; } } } /*哈弗曼构造结束*/ fseek(ifp,0,SEEK_SET); /*把文件指针指向文件的开头*/ fwrite(&flength,sizeof(int),1,ofp); //把哈弗曼代码写入ofp文件 fseek(ofp,8,SEEK_SET); buf[0]=0; f=0; pt1=8; while(!feof(ifp)) { c=fgetc(ifp); //从流中读取一个字符,并增加文件指针的位置 f++; for(i=0;i { if(c==header[i].b) break; } strcat(buf,header[i].bits); //把header[i].bits所指字符串添加到buf结尾处 j=strlen(buf); //计算字符串buf的长度 c=0; while(j>=8) { for(i=0;i<8;i++) { if(buf[i]=='1') c=(c<<1)|1; else c=c<<1; } fwrite(&c,1,1,ofp); pt1++; strcpy(buf,buf+8); j=strlen(buf); } if(f==flength) break; } if(j>0) { strcat(buf,\ for(i=0;i<8;i++) { if(buf[i]=='1') c=(c<<1)|1; else c=c<<1; } fwrite(&c,1,1,ofp); pt1++; } fseek(ofp,4,SEEK_SET); /*fseek 用于二进制方式打开的文件,移动文件读写指针位置.第一个是文件流,第3个是指针零点位置,第2个是把指针移动到的地点. */ fwrite(&pt1,sizeof(long),1,ofp); /*是要输出数据的地址,每次写入的位数,数据项的个数,目标文件地址*/ fseek(ofp,pt1,SEEK_SET); fwrite(&n,sizeof(long),1,ofp); for(i=0;i fwrite(&(header[i].b),1,1,ofp); c=strlen(header[i].bits); fwrite(&c,1,1,ofp); j=strlen(header[i].bits); if(j%8!=0) /*按八位读取*/ { for(f=j%8;f<8;f++) strcat(header[i].bits,\ } while(header[i].bits[0]!=0) { c=0; for(j=0;j<8;j++) { if(header[i].bits[j]=='1') c=(c<<1)|1; else c=c<<1; } strcpy(header[i].bits,header[i].bits+8); /*把从header[i].bits+8地址开始且含有NULL结束符的字符串赋值到以header[i].bits开始的地址空间 */ fwrite(&c,1,1,ofp); } } fclose(ifp); fclose(ofp); printf(\压缩成功\\n\ } void main() /*主函数*/ {printf(\输入a开始压缩\\n\printf(\输入b结束压缩\\n\ while(1) { char c; c=getch(); if(c=='a') yasuo(); else { if(c=='b') return;} } } 压缩的图解 解压的代码 #include unsigned char b; /*the charactor*/ long count; /*the frequency*/ long parent,lch,rch; /*make a tree*/ char bits[256]; /*the haffuman code*/ } header[512],tmp; void jieya() /*解压*/ { char filename[255],outputfile[255],buf[255],bx[255]; unsigned char c; char wenjianming[255]; long i,j,m,n,f,p,l; long flength; FILE *ifp,*ofp; printf(\要解压的文件:\ gets(filename);