• 大小: 10.8MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-03
  • 语言: C/C++
  • 标签: 文件压缩  

资源简介

该程序能压缩文档、图片、小视频等文件,并且基于C++的算法实现,简单易懂......

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
// 统计字符频度的临时结点
typedef struct {
unsigned char uch; // 以8bits为单元的无符号字符
unsigned long weight; // 每类(以二进制编码区分)字符出现频度
} TmpNode;

// 哈夫曼树结点
typedef struct {
unsigned char uch; // 以8bits为单元的无符号字符
unsigned long weight; // 每类(以二进制编码区分)字符出现频度
char *code; // 字符对应的哈夫曼编码(动态分配存储空间)
int parent lchild rchild; // 定义双亲和左右孩子
} HufNode *HufTree;

// 选择最小和次小的两个结点,建立哈夫曼树调用
void select(HufNode *huf_tree unsigned int n int *s1 int *s2)
{
// 找最小
unsigned int i;
unsigned long min = ULONG_MAX;
for (i = 0; i < n; ++i)
if (huf_tree[i].parent == 0 && huf_tree[i].weight < min)
{
min = huf_tree[i].weight;
*s1 = i;
}
huf_tree[*s1].parent = 1;   // 标记此结点已被选中

// 找次小
min = ULONG_MAX;
for (i = 0; i < n; ++i)
if (huf_tree[i].parent == 0 && huf_tree[i].weight < min)
{
min = huf_tree[i].weight;
*s2 = i;
}
}

// 建立哈夫曼树
void CreateTree(HufNode *huf_tree unsigned int char_kinds unsigned int node_num)
{
unsigned int i;
int s1 s2;
for (i = char_kinds; i < node_num; ++i)
{
select(huf_tree i &s1 &s2); // 选择最小的两个结点
huf_tree[s1].parent = huf_tree[s2].parent = i;
huf_tree[i].lchild = s1;
huf_tree[i].rchild = s2;
huf_tree[i].weight = huf_tree[s1].weight + huf_tree[s2].weight;
}
}

// 生成哈夫曼编码
void HufCode(HufNode *huf_tree unsigned char_kinds)
{
unsigned int i;
int cur next index;
char *code_tmp = (char *)malloc(256 * sizeof(char)); // 暂存编码,最多256个叶子,编码长度不超多255
code_tmp[256 - 1] = ‘\0‘;

for (i = 0; i < char_kinds; ++i)
{
index = 256 - 1; // 编码临时空间索引初始化

// 从叶子向根反向遍历求编码
for (cur = i next = huf_tree[i].parent; next != 0;
cur = next next = huf_tree[next].parent)
if (huf_tree[next].lchild == cur)
code_tmp[--index] = ‘0‘; // 左‘0’
else
code_tmp[--index] = ‘1‘; // 右‘1’
huf_tree[i].code = (char *)malloc((256 - index) * sizeof(char)); // 为第i个字符编码动态分配存储空间 
strcpy(huf_tree[i].code &code_tmp[index]);     // 正向保存编码到树结点相应域中
}
free(code_tmp); // 释放编码临时空间
}

// 压缩函数
int compress(char *ifname char *ofname)
{
unsigned int i j;
unsigned int char_kinds; // 字符种类
unsigned char char_temp; // 暂存8bits字符
unsigned long file_len = 0;
unsigned long length1 length2 pt;
//unsigned long size;
double div;
FILE *infile *outfile;
TmpNode node_temp;
unsigned int node_num;
HufTree huf_tree;
char code_buf[256] = “\0“; // 待存编码缓冲区
unsigned int code_len;
/*
** 动态分配256个结点,暂存字符频度,
** 统计并拷贝到树结点后立即释放
*/
TmpNode *tmp_nodes = (TmpNode *)malloc(256 * sizeof(TmpNode));

// 初始化暂存结点
for (i = 0; i < 256; ++i)
{
tmp_nodes[i].weight = 0;
tmp_nodes[i].uch = (unsigned char)i; // 数组的256个下标与256种字符对应
}

// 遍历文件,获取字符频度
infile = fopen(ifname “rb“);
// 判断输入文件是否存在
if (infile == NULL)
return -1;
fread((char *)&char_temp sizeof(unsigned char) 1 infile); // 读入一个字符
while (!feof(infile))
{
++tmp_nodes[char_temp].weight; // 统计下标对应字符的权重,利用数组

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\.vs\
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\.vs\哈夫曼文件压缩\
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\.vs\哈夫曼文件压缩\v14\
     文件       25088  2017-07-08 17:10  哈夫曼文件压缩\.vs\哈夫曼文件压缩\v14\.suo
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\Debug\
     文件       59392  2017-07-08 15:13  哈夫曼文件压缩\Debug\哈夫曼文件压缩.exe
     文件      404480  2017-07-08 15:13  哈夫曼文件压缩\Debug\哈夫曼文件压缩.ilk
     文件     1052672  2017-07-08 15:13  哈夫曼文件压缩\Debug\哈夫曼文件压缩.pdb
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\哈夫曼文件压缩\
     文件        1345  2017-07-08 08:30  哈夫曼文件压缩\哈夫曼文件压缩.sln
     文件    29028352  2017-07-08 17:10  哈夫曼文件压缩\哈夫曼文件压缩.VC.db
     文件       14621  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\1.cpp
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\哈夫曼文件压缩\Debug\
     文件      102947  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\1.obj
     文件      789504  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\vc140.idb
     文件      495616  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\vc140.pdb
     文件        1552  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.Build.CppClean.log
     文件         829  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.log
     目录           0  2017-08-01 18:31  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\
     文件         796  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.command.1.tlog
     文件       26826  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.read.1.tlog
     文件         664  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.write.1.tlog
     文件        1334  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\link.command.1.tlog
     文件        2618  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\link.read.1.tlog
     文件         648  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\link.write.1.tlog
     文件         241  2017-07-08 15:13  哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\哈夫曼文件压缩.lastbuildstate
     文件        7412  2017-07-08 14:33  哈夫曼文件压缩\哈夫曼文件压缩\哈夫曼文件压缩.vcxproj
     文件         942  2017-07-08 08:47  哈夫曼文件压缩\哈夫曼文件压缩\哈夫曼文件压缩.vcxproj.filters

评论

共有 条评论