本文共 2067 字,大约阅读时间需要 6 分钟。
使用哈夫曼编码对文本文件进行压缩。
#include #include #include #include #include #include #include #include #include #include using namespace std;typedef unsigned char uc;typedef unsigned long long ull;string s2;vector G[512];//用vector存储哈夫曼树typedef vector ::iterator ITER;string anss[256];typedef pair data;//堆中存储的数据类型为pair #define N 1000000uc sp[N+5];int lenp;char s[N+5],table[256];int n,m;int cnts[256];//记录各字符出现频率int ReadIn(FILE* fp);//读入文本文件,返回其总长度void Freq_stats();//统计各字符出现频率void dfs(int U,string s);//深度优先遍历哈夫曼树,生成每个字符的哈夫曼编码void HuffmanCoding();//用堆实现哈夫曼编码主过程int main(){ int op; char ch; while(1){ system("cls"); printf("请输入对应数字选择您想要的功能:\n"); printf("1.压缩当前目录下的test.txt文件到test.comp,并且输出各字符出现频率以及编码表。\n"); printf("2.解压当前目录下的test.comp文件,并且输出原文本到test2.txt。\n"); printf("3.退出程序。\n"); scanf("%d",&op); if(op==1){ FILE* fp=fopen("test.txt","r"); n=ReadIn(fp); puts(""); fclose(fp); Freq_stats(); puts(""); HuffmanCoding(); puts(""); fp=fopen("test.comp","wb"); s2.clear(); for(int i=0;i ma; for(int i=1;i<=m;++i){ fread(x,sizeof(char),1,fp); fread(tlen,sizeof(char),1,fp); fread(y,sizeof(ull),1,fp); string ts=""; for(int j=tlen[0]-1;j>=0;--j){ ts+=(char)((y[0]>>j)&1); } ma[ts]=x[0]; } memset(sp,0,sizeof(sp)); fread(sp,sizeof(uc),N,fp); fclose(fp); string now=""; FILE* fp2=fopen("test2.txt","w"); int nn; for(int i=N+4;i>=0;--i){ if(sp[i]){ nn=i; break; } } puts("解压后的原文本为:"); for(int i=0;i >(lim-1-j))&1); if(ma[now]){ putchar(ma[now]); fprintf(fp2,"%c",ma[now]); now.clear(); } } } fclose(fp2); puts(""); printf("按任意键继续"); while(!kbhit()); ch=getch(); if(ch==-32){ getch(); } } else{ break; } } return 0;}int ReadIn(FILE* fp){ int len=0; while(!feof(fp)){ fgets(s+len,N,fp); len+=strlen(s+len); } puts("原文本:"); puts(s); return len;}void Freq_stats(){ m=0; memset(cnts,0,sizeof(cnts)); for(int i=0;i ,greater >Heap; for(int i=0;i<256;++i){ if(cnts[i]){ Heap.push(make_pair(cnts[i],i)); } } for(int i=1;i
转载于:https://www.cnblogs.com/autsky-jadek/p/8151008.html