谁能把我看一下这个代码,哈夫曼编码压缩的,为什么压缩到最后总是会乱码?
#define _CRT_SECURE_NO_DEPRECATE
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int bytes_count = 0;//哈夫曼树的叶子节点
long long file_length = 0;//保持文件的字节数,初始为0
const int FILENAMEMAX = 128;//文件名(包括路径),长度不能超过127
const int SUFFIXNAMEMAX = 10;//文件后缀名长度不超过9个字符
char sourse_filename[FILENAMEMAX] = "test.txt";//源文件名字
char compress_filename[FILENAMEMAX] = "test.buf";//压缩文件名字
char decompress_filename[FILENAMEMAX] = "detest";//解压文件名字
char prefix_filename[128];//文件前缀名
char suffix_filename[128];//文件后缀名
const int BUFF_MAXSIZE = 1024 * 1024;//文件哈夫曼编码缓冲区的大小
char buff[BUFF_MAXSIZE] = "";/*文件哈夫曼编码缓冲区(生成压缩文件时,各字节
字节的编码先存在buff中,然后8个码压缩成一个字节存到buff_string中缓冲区)*/
char buff_string[BUFF_MAXSIZE / 8] = "";//压缩文件写入缓冲区
const int BLOCK_MAXSIZE = 1024 * 1024;//解写入解压文件的缓冲区的大小
char block[BLOCK_MAXSIZE] = "";//写入解压文件的缓冲区
int block_current = 0;//写解压文件缓冲区的当前读写位置
struct HaffNode
{
unsigned char byte;//结点数据
long long weight;//权值
int parent;//双亲结点下标
int leftChild;//左孩子下标
int rightChild;//右孩子下标
char code[256];//哈夫曼编码
int code_len;//编码长度
};
HaffNode HaffTree[511];
HaffNode HaffTree2[511];
HaffNode HaffTree3[511];
void initHaffTree();
void Statistics();
bool compare(HaffNode a, HaffNode b);
void paixu();
void createTree();
void creatHaffCode();
void writeCompressFile();
void uncompress();
void ptf();
#include"T.h"
int main()
{
writeCompressFile();
uncompress();
}
void initHaffTree()
{
for (int i = 0; i < 511; i++)
{
HaffTree.parent = HaffTree.leftChild = HaffTree.rightChild = -1;
HaffTree.weight=0;
HaffTree.byte=0;
}
}
void Statistics()
{
FILE *ifp;
//printf("\t请你输入需要压缩的文件名: ");
////cin >> sourse_filename;//获取文件路径
ifp = fopen(sourse_filename, "rb");
if (ifp == NULL)
{
printf("\n\t文件打开失败!\n\n");
system("pause");
}
//////////////////////////////////////////////////////////////////////////////////
unsigned char c;//接收读取的一个字节
while (!feof(ifp))
{
fread(&c, 1, 1, ifp);//从文件中读取一个字节到c
HaffTree[c].weight++;
file_length++;//统计源文件长度,每读一字节长度+1
}
file_length--;//原文件的长度多计算了一次
HaffTree[c].weight--;
/*cout |
免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。
版权声明:作者保留权利,不代表天盟立场。
|
|
|
|