基于Huffman编码的C语言解压缩文件程序(5)

/*用于在解压的时候将读取到的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);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a287560f1be06e4c9967e0a3f6500edb.html