项目描述:
项目简介:利用哈夫曼编码的方式对文件进行压缩,并且对压缩文件可以解压
开发环境:windows vs2013
项目概述:
1.压缩
a.读取文件,将每个字符,该字符出现的次数和权值构成哈夫曼树
b.哈夫曼树是利用小堆构成,字符出现次数少的节点指针存在堆顶,出现次数多的在堆底
c.每次取堆顶的两个数,再将两个数相加进堆,直到堆被取完,这时哈夫曼树也建成
d.从哈夫曼树中获取哈夫曼编码,然后再根据整个字符数组来获取出现了得字符的编码
e.获取编码后每次凑满8位就将编码串写入到压缩文件(value处理编码1与它即可,0只移动位)
f.写好配置文件,统计每个字符及其出现次数,并以“字符+','+次数”的形式保存到配置文件中
2.解压
a.读取配置文件,统计所有字符的个数
b.构建哈夫曼树,读解压缩文件,将所读到的编码字符的这个节点所所含的字符写入到解压缩文件中,知道将压缩文件读完
c.压缩解压缩完全完成,进行小文件大文件的测试
代码如下:
#pragma once
#include"HuffManTree.h"
#include<string>
struct CharInfo
{
CharInfo(int count=0)
:_count(count)
{
}
bool operator<(const CharInfo info)
{
return _count < info._count;
}
bool operator>(const CharInfo info)
{
return _count>info._count;
}
bool operator!=(const CharInfo info)
{
return _count != info._count;
}
CharInfo operator+(const CharInfo Info)
{
return CharInfo(_count + Info._count);
}
char _ch;//字符
int _count;//字符出现的次数
string _code;//字符对应的编码
};
class FileCompress
{
public:
FileCompress()
{
for (int i = 0; i < 256; i++)
{
_info[i]._ch = i;
_info[i]._count = 0;
}
}
public: