没有合适的资源?快使用搜索试试~ 我知道了~
用哈弗曼编码对文件进行压缩与解压
3星 · 超过75%的资源 需积分: 10 14 下载量 55 浏览量
2011-06-10
21:16:28
上传
评论
收藏 10KB TXT 举报
温馨提示
试读
13页
采用静态的哈弗曼编码,可以实现对文件的压缩与解压,并且可以计算压缩、解压速度,压缩率等~
资源推荐
资源详情
资源评论
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctime>
struct head
{
unsigned char b; //记录字符在数组中的位置
long count; //字符出现频率(权值)
long parent,lch,rch; //定义哈夫曼树指针变量
char bits[256]; //定义存储哈夫曼编码的数组
}
header[512],tmp;
/*压缩*/
void compress()
{
char filename[255],outputfile[255],buf[512];
unsigned char c;
long i,j,m,n,f,lh=0;
long min1,pt1,flength,length1,length2;
double div,time,time1,time2,rate;
FILE *ifp,*ofp;
printf("\t请您输入需要压缩的文件:");
gets(filename);
ifp=fopen(filename,"rb");
if(ifp==NULL)
{
printf("\n\t文件打开失败!\n\n");
return;
}
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctime>
struct head
{
unsigned char b; //记录字符在数组中的位置
long count; //字符出现频率(权值)
long parent,lch,rch; //定义哈夫曼树指针变量
char bits[256]; //定义存储哈夫曼编码的数组
}
header[512],tmp;
/*压缩*/
void compress()
{
char filename[255],outputfile[255],buf[512];
unsigned char c;
long i,j,m,n,f,lh=0;
long min1,pt1,flength,length1,length2;
double div,time,time1,time2,rate;
FILE *ifp,*ofp;
printf("\t请您输入需要压缩的文件:");
gets(filename);
ifp=fopen(filename,"rb");
if(ifp==NULL)
{
printf("\n\t文件打开失败!\n\n");
return;
}
printf("\t请您输入压缩后的文件名:");
gets(outputfile);
ofp=fopen(strcat(outputfile,".hub"),"wb");
if(ofp==NULL)
{
printf("\n\t压缩文件失败!\n\n");
return;
}
flength=0;
time1=clock();
while(!feof(ifp))
{
fread(&c,1,1,ifp);
header[c].count++; //字符重复出现频率+1
flength++; //字符出现原文件长度+1
}
lh=flength;
flength--;
length1=flength;//原文件长度用作求压缩率的分母
header[c].count--;
for(i=0;i<512;i++)
{
if(header[i].count!=0) header[i].b=(unsigned char)i;
/*将每个哈夫曼码值及其对应的ASCII码存放在一维数组header[i]中,
且编码表中的下标和ASCII码满足顺序存放关系*/
else header[i].b=0;
header[i].parent=-1;header[i].lch=header[i].rch=-1; //对结点进行初始化
}
for(i=0;i<256;i++) //根据频率(权值)大小,对结点进行排序,选择较小的结点进树
{
gets(outputfile);
ofp=fopen(strcat(outputfile,".hub"),"wb");
if(ofp==NULL)
{
printf("\n\t压缩文件失败!\n\n");
return;
}
flength=0;
time1=clock();
while(!feof(ifp))
{
fread(&c,1,1,ifp);
header[c].count++; //字符重复出现频率+1
flength++; //字符出现原文件长度+1
}
lh=flength;
flength--;
length1=flength;//原文件长度用作求压缩率的分母
header[c].count--;
for(i=0;i<512;i++)
{
if(header[i].count!=0) header[i].b=(unsigned char)i;
/*将每个哈夫曼码值及其对应的ASCII码存放在一维数组header[i]中,
且编码表中的下标和ASCII码满足顺序存放关系*/
else header[i].b=0;
header[i].parent=-1;header[i].lch=header[i].rch=-1; //对结点进行初始化
}
for(i=0;i<256;i++) //根据频率(权值)大小,对结点进行排序,选择较小的结点进树
{
剩余12页未读,继续阅读
资源评论
- joker龙2013-07-03不错,很好用
七分熟
- 粉丝: 14
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功