 2018-04-17 18:10

# 关于HUFFMAN利用数组压缩的算法问题

5

{
unsigned char b; /*the charactor*/
long count; /*the frequency*/
long parent,lch,rch; /*make a tree*/
char bits; /*the haffuman code*/
}

void compress()
{

clock_t start,end;
char filename,outputfile,buf;
int fn = 0, sz = 0, sz1 = 0;
double x = 0;
unsigned char c;
long i,j,m,n,f;
long min1,pt1,flength;
FILE ifp,*ofp;
printf("源文件名:");
gets_s(filename);
ifp=fopen(filename,"rb");
if(ifp==NULL)
{
printf("源文件打开失败!\n");
return;
}
fn = _fileno(ifp); /

sz = _filelength(fn);/*根据文件号取得文件大小*/
printf("文件大小为:%d B.\n", sz);
sz1 = sz;
printf("压缩后文件名:");
gets_s(outputfile);
start=clock(); /* 计时开始 */
ofp=fopen(outputfile,"wb");
if(ofp==NULL)
{
printf("压缩文件打开失败!\n");
return;
}
flength=0;

while(!feof(ifp))
{
flength++; //字符出现原文件长度+1
}
flength--;
for(i=0;i {

}
for(i=0;i {
for(j=i+1;j {
}
}
}
for(i=0;i n=i;
m=2*n-1; //外部叶子结点数为n个时，内部结点数为n-1，整个哈夫曼树的需要的结点数为2*n-1.
for(i=n;i {
min1=999999999;
for(j=0;j {
{
pt1=j;
continue;
}
}
min1=999999999;
for(j=0;j {
{
pt1=j;
continue;
}
}
}
for(i=0;i {
f=i;
{
j=f;
{
//依次存储连接“0”“1”编码
}
else//置右分支编码1
{
}
}
}
fseek(ifp,0,SEEK_SET);//从文件开始位置向前移动0字节，即定位到文件开始位置
fwrite(&flength,sizeof(int),1,ofp);/*用来将数据写入文件流中，参数flength指向欲写入的数据地址，

fseek(ofp,8,SEEK_SET);
buf=0; //定义缓冲区,它的二进制表示00000000
f=0;
pt1=8;
/*假设原文件第一个字符是"A"，8位2进制为01000001，编码后为0110识别编码第一个'0'，

while(!feof(ifp))
{
c=fgetc(ifp);
f++;
for(i=0;i {
}
j=strlen(buf);
c=0;
while(j>=8) //对哈夫曼编码位操作进行压缩存储
{
for(i=0;i {
if(buf[i]=='1') c=(c else c=c }
fwrite(&c,1,1,ofp);
pt1++; //统计压缩后文件的长度
strcpy(buf,buf+8);//一个字节一个字节拼接
j=strlen(buf);
}
if(f==flength) break;
}
if(j>0) //对哈夫曼编码位操作进行压缩存储
{
strcat(buf,"00000000");
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);
fwrite(&pt1,sizeof(long),1,ofp);
fseek(ofp,pt1,SEEK_SET);
fwrite(&n,sizeof(long),1,ofp);
for(i=0;i<n;i++)
{
fwrite(&c,1,1,ofp);
if(j%8!=0) //若存储的位数不是8的倍数，则补0

{
for(f=j%8;f<8;f++)
}
{
c=0;
for(j=0;j<8;j++) //字符的有效存储不超过8位，则对有效位数左移实现两字符编码的连接
{
else c=c<<1;
}
fwrite(&c,1,1,ofp);
}
}
fclose(ifp);

printf("压缩成功!\n");
end=clock(); /* 计时结束 /
fn = _fileno(ofp); /

sz = _filelength(fn);/*根据文件号取得文件大小*/
printf("压缩后文件大小为:%d B.\n", sz);
x = (sz / sz1)*1.0;
printf("压缩率为:%d B.\n", x);
fclose(ofp);
printf("压缩用时%f秒\n",(double)(end - start) / CLOCKS_PER_SEC);
return;
}

//