用哈夫曼编码C语言实现文件压缩 联系客服

发布时间 : 星期一 文章用哈夫曼编码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 #include #include #include struct head {

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);