如果你还对哈夫曼树感到陌生的话,可以去看看这篇博客:
http://blog.csdn.net/fengasdfgh/article/details/52907353
思路:
压缩思路:
由于我们可以利用哈夫曼编码把文档中的每个字符表示为二进制编码.
比如文档里保存一个字符串“abbbcds”,我们可以通过统计每个字符出现的次数来构建哈夫曼树,这样每个字符有唯一的编码,如 a : 100, b : 0, c : 101, d : 110,
s : 111;
这样原字符串可表示为一个二进制序列:100 0 0 0 101 110 111。
接下来我们遍历这个二进制序列并每次以8位 得到一个数并把它作为一个字符写入一个文件,如果二进制序列的长度不是8的整数倍,我们可以补零直到为8的整数倍。
这就是我们的压缩文件。
压缩文件代码:
FILE *trans(const string str)
{
errno_t error;
FILE* file;
error = fopen_s(&file, str.c_str(), "rb");
if (error)
{
throw 1;
}
Node *root = NULL;
//我们构建哈夫曼树需要一个最小堆
Plie<Node*, compare<Node *>> d;
vector<unsigned long > count(256, 0);
//contrat保存着每个字符所对应的编码
map<int, string> contrast;
//统计字符次数
unsigned char va = 0;
while (fread(&va, 1, 1, file) != 0 )
{
count[va]++;
}
fclose(pf);
//将出现过的字符转化为Node
for (int i = 0; i < 256; i++)
{
if (count[i] != 0)
{
Node *p = new Node(i, count[i]);
d.push(p);
}
}
//构建哈夫曼树
root = construct(d);
//记录字符所对应的新编码
Tran(root, contrast);
size_t pos = str.rfind('.');
string s = str.substr(0, pos);
string s1 = s + "configer.txt";
//创建一个配置文件
FILE *fff = NULL;
error = fopen_s(&fff, s1.c_str(), "wb");
if (error)
{
cout << s1.c_str() << ends;