• 大小: 66KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: C/C++
  • 标签: 文件压缩  C++实现  

资源简介

基于VC++6.0的cpp文件 带有命令行界面,程序可直接运行,对文本类文件压缩率较高

资源截图

代码片段和文件信息

//用哈夫曼压缩文件(C语言)
//利用哈夫曼编码制作压缩软件,内容如下:
#include  
#include  
#include  
#include 

struct head 
{
unsigned char b;        //记录字符在数组中的位置
long count;             //字符出现频率(权值) 
long parentlchrch;    //定义哈夫曼树指针变量
char bits[256];         //定义存储哈夫曼编码的数组

header[512]tmp;

/*压缩*/
void compress() 
{
char filename[255]outputfile[255]buf[512]; 
unsigned char c; 
long ijmnf; 
long min1pt1flengthlength1length2; 
double div;
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; 
while(!feof(ifp)) 
{
fread(&c11ifp); 
header[c].count++;    //字符重复出现频率+1
flength++;            //字符出现原文件长度+1
}
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++)    //根据频率(权值)大小,对结点进行排序,选择较小的结点进树
{
for(j=i+1;j<256;j++)
{
if(header[i].count {
tmp=header[i];
header[i]=header[j]; 
header[j]=tmp; 


}
for(i=0;i<256;i++) if(header[i].count==0) break; 
n=i;       //外部叶子结点数为n个时,内部结点数为n-1,整个哈夫曼树的需要的结点数为2*n-1.
m=2*n-1;
for(i=n;i {
min1=999999999;   //预设的最大权值,即结点出现的最大次数
for(j=0;j {
if(header[j].parent!=-1) continue;    
//parent!=-1说明该结点已存在哈夫曼树中,跳出循环重新选择新结点*/
if(min1>header[j].count) 
{
pt1=j; 
min1=header[j].count; 
continue; 

}
header[i].count=header[pt1].count; 
header[pt1].parent=i;   //依据parent域值(结点层数)确定树中结点之间的关系
header[i].lch=pt1;   //计算左分支权值大小
min1=999999999;   
for(j=0;j {
if(header[j].parent!=-1) continue; 
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;   //根结点编码0   
while(header[f].parent!=-1) 
{
j=f; 
f=header[f].parent; 
if(header[f].lch==j)   //置左分支编码0
{
j=strlen(header[i].bits); 
memmove(header[i].bits+1header[i].bitsj+1);
//依次存储连接“0”“1”编码
header[i].bits[0]=‘0‘; 
}
else   //置右分支编码1
{
j=strlen(header[i].bits); 
memmove(header[i].bits+1header[i].bitsj+1); 
header[i].bits[0]=‘1‘; 


}
fseek(ifp0SEEK_SET);   //从文件开始位置向前移动0字节,即定位到文件开始位置
fwrite(&flengthsizeof(int)1ofp);
/*用来将数据写入文件流中,参数flength指向欲写入的数据地址,

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-05-11 17:08  Huffman实现文件压缩与解压\
     文件        9437  2017-04-21 18:28  Huffman实现文件压缩与解压\Huffman.cpp
     文件        9134  2010-11-02 22:10  Huffman实现文件压缩与解压\I have a dream.txt
     文件       66616  2005-11-09 20:04  Huffman实现文件压缩与解压\lena.bmp

评论

共有 条评论