设为首页 加入收藏

TOP

基于Huffman编码的C语言解压缩文件程序(三)
2014-11-23 21:31:46 来源: 作者: 【 】 浏览:48
Tags:基于 Huffman 编码 语言 压缩 文件 程序
=0;j eight[k++] = HC[i][j]-'0';/*我们存储的是字符串,是多少就是多少*/
}
//当flag>=8的时候,将8位写进压缩文件,同时将剩余的没有写入的huffman编码重新移到
//eight【】数组前面去,同时修改flag
else if(flag>=8)
{
//将匹配到的huffman编码写进8位数组,直到k值为8,k值始终代表现在eight【】数组的长度
for(j=0;k<8;j++)
eight[k++] = HC[i][j]-'0';
//将匹配到的huffman编码的没有完全写进去的添加到后面。
for(;j eight[k++] = HC[i][j]-'0';
//计算8位对应的int值,写入文件
sum+=eight[0]*128+eight[1]*64+eight[2]*32+eight[3]*16+eight[4]*8
+eight[5]*4+eight[6]*2+eight[7]*1;
//前8为置0
for(j=0;j<8;j++)
eight[j] = 0;
//将后面的移植到前面去
for(j=8;j eight[j-8] = eight[j];
//重置flag与k
k = flag = j-8;
//写进文件
char c = sum;
fputc(c,fw);


if(aa%1000==0)
{
printf("\r正在进行压缩,请稍等……%6.2f%%",(double)aa/sum_bytes*100.0);
}
fflush(fw);
i = count+1;
}
}
}
}
aa = sum_bytes;
printf("\r正在进行压缩,请稍等……%6.2f%%",(double)aa/sum_bytes*100.0);
printf("压缩成功!");
/*考虑到最后可能没有凑够八位的情况*/
if(flag)
{
sum+=eight[0]*128+eight[1]*64+eight[2]*32+eight[3]*16+eight[4]*8
+eight[5]*4+eight[6]*2+eight[7]*1;
char c = sum;
fputc(c,fw);
sum_bit +=flag;
fflush(fw);
}
fclose(fw);
fclose(fo);
}


/*用于在解压的时候将读取到的ASCII码转换为二进制数*/
int swap(int data)
{
int i = 0;
while(data)
{
num[i++] = data%2;
data = data/2;
}
return i;
}


/*进行文件的解压*/
void uncompress_file(char* file1,char* file2)
{


FILE *fo = fopen(file1,"rb");
FILE *fw = fopen(file2,"wb");
if(fo==NULL ||fw == NULL)
{
printf("文件打开失败!");
return;
}
char str[1000];
int i,j,k,temp = 0;
int index;
int sum_bit2 = sum_bit;
//直到读取到文件结尾
while(!feof(fo))
{
if(sum_bit2<0) break;
//读取一次,减去8位
sum_bit2 -=8;
int data = fgetc(fo);
if(data == -1) break;
//index用来在sum_bit2小于0的时候设置读取为位数(也就是说最后不用读取8位了)
if(sum_bit2<0)
{
index = 0-sum_bit2;
}
else
{
index = 0;
}
if(data == -1) break;
memset(num,0,sizeof(num));
//将读取到的data转换成二进制数
swap(data);
i = temp;
//将转换后的二进制数变为字符串,注意顺序
//是一位一位的往里面填,填进去一位立即进行比较,当找到相应的信息就调出来
for(k=7;k>=index;i++,k--)
{
if(num[k])
str[i] = '1';
else
str[i] = '0';


str[i+1] ='\0';
//查找编码表当中与该字符串(编码)相同的信息,然后将叶子信息写入解压文件
for(j=1;j<=count;j++)
{
if(strcmp(str,HC[j])==0)
{
//将叶子信息写入到文件(写入的是int值,是该int值表示的字符)
fputc(code[j],fw);
if((sum_bit-sum_bit2)%1500==0)
{
printf("\r文件正在解压中,请耐心等待……%6.2f%%",(double)(sum_bit-sum_bit2)/sum_bit*100.0);
}


fflush(fw);
j = count+1;
i = -1;
}
}
}
if(i)
{
temp = i;
}
else
{
temp = 0;
}
}
sum_bit2 = 0;
printf("\r文件正在解压中,请耐心等待……%6.2f%%",(double)(sum_bit-sum_bit2)/sum_bit*100.0);
printf("解压成功!");
fclose(fw);
fclose(fo);
}


int main(int argc, char **argv)
{
if(strcmp(argv[1],"-c")==0)
{
//获取文件的词频
calWeight(argv[2]);
//申请Huffman树的内存,已经获得叶子节点数,根据节点总数与叶子节点数的关系分配内存
Node *huffmanTree = (Node *)malloc((2*count-1+1)*sizeof(Node));
//创建Huffman树
creat

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇双链表&链表合并&多项式相加算法 下一篇Huffman编码——Java实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: