编码-霍夫曼树程序,输入字符串统计字符出现次数并译码。请问如何改成从文件读入字符串?

问题描述

霍夫曼树程序,输入字符串统计字符出现次数并译码。请问如何改成从文件读入字符串?
//生成HuffmanCode文件的两个函数
void HuffmanEncoding(HuffmanTree HTHuffmanCode HC){//根据HuffmanTreeHT求HuffmanCode表HC
int cpi;
char cd[n];
int start;
cd[num] = '';
for(i = 1;i <= num;i++){
start = num;
c = i;
while((p = HT[c].parent) > 0){
cd[--start] = (HT[p].lchild == c)?'0':'1';
c = p;
}
strcpy(HC[i].bits&cd[start]);
HC[i].len = num - start;
}
}

void coding(HuffmanCode HCchar *str){//对所代表的字符串进行编码,并写入文件
int ij;
FILE *fp;
fp=fopen(""codefile.txt""w"");
while(*str){
for(i = 1;i <= num;i++){
if(HC[i].ch == *str){
for(j = 0;j < HC[i].len;j++)
fputc(HC[i].bits[j]fp);
break;
}
}str++;
}fclose(fp);
}
//电文的译码
char * decode(HuffmanCode HC){
FILE *fp;
char str[254];
char *p;
static char cd[n+1];
int ijk = 0cjs;
fp = fopen(""codefile.txt""r"");
while(!feof(fp)){
cjs = 0;
for(i = 0;i < num&&cjs == 0&&!feof(fp);i++){
cd[i] = ' ';
cd[i+1] = '';
cd[i] = fgetc(fp);
for(j = 1;j <= num;j++){
if(strcmp(HC[j].bitscd) == 0){
str[k] = HC[j].ch;
k++;
cjs = 1;
break;
}
}
}
}
str[k] = '';
p = str;
return p;
}
//测试主控函数
void main(){
char st[254]*sstr[27];
int cn[27];
HuffmanTree HT;
HuffmanCode HC;
printf(""输入需要编码的字符串(假设均为大写字母):
"");
gets(st);
num = jsq(stcnstr);//统计字符的种类及各类字符出现的频率
CreHuffmanTree(HTHCcnstr);//建立赫夫曼树
HuffmanEncoding(HTHC);//生成赫夫曼编码
coding(HCst);//建立电文赫夫曼编码文件
s = decode(HC);//读编码文件译码
printf(""译码后的字符串:%s
""s);//输出译码后的字符串
printf(""字符串长度:%d
""strlen(s));
}

解决方案

在项目目录下建一个1.txt文件存放字符串,然后运行。

 #include <stdio.h>void main(){    char st[254]*sstr[27];    int cn[27];    HuffmanTree HT;    HuffmanCode HC;//-------------------------------------    FILE *fp=NULL;    fp=fopen(""1.txt""r"");    if(NULL==fp)    {        printf(""1.txt打开失败!
"");        return ;    }    fscanf(fp%s""st);    fclose(fp);//-------------------------------------    //printf(""输入需要编码的字符串(假设均为大写字母):
"");    //gets(st);    num = jsq(stcnstr);//统计字符的种类及各类字符出现的频率    CreHuffmanTree(HTHCcnstr);//建立赫夫曼树    HuffmanEncoding(HTHC);//生成赫夫曼编码    coding(HCst);//建立电文赫夫曼编码文件    s = decode(HC);//读编码文件译码    printf(""译码后的字符串:%s
""s);//输出译码后的字符串    printf(""字符串长度:%d
""strlen(s));}

解决方案二:
c语言读取txt文件命令

解决方案三:
输入任意字符串,统计字符串中每个字符出现的次数

时间: 2024-10-31 10:58:03

编码-霍夫曼树程序,输入字符串统计字符出现次数并译码。请问如何改成从文件读入字符串?的相关文章

编码-赫夫曼树出错 ,编译没错 不知道哪里错了运行不了

问题描述 赫夫曼树出错 ,编译没错 不知道哪里错了运行不了 编译没有错误,运行失败 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 没分号";" #define STACKINCREMENT 10 //存储空间分配增量 #define TRUE 1 #def

哈夫曼编码 哈夫曼树

1.定义 哈夫曼编码主要用于数据压缩. 哈夫曼编码是一种可变长编码.该编码将出现频率高的字符,使用短编码:将出现频率低的字符,使用长编码. 变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀.如:0.10就是非前缀编码,而0.01不是非前缀编码. 2.哈夫曼树的构造 按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止. 对于5个字符A.B.C.D.E,频率分别用1.5.7.9.6表示,

编码-哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)

问题描述 哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出) #include #include #include #define maxsize 100 #define max 100 typedef struct { char data; int weight; int parent; int lchild; int rchild; }huffnode; typedef struct { char cd[max]; int start; }

霍夫曼树编码的实现

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>typedef struct{ unsigned int Weight; unsigned int Parent; unsigned int lChild; unsigned int rChild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;int LookFo

贪心算法-霍夫曼编码

霍夫曼编码是一种无损数据压缩算法.在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度.期望值降低,从而达到无损压缩数据的目的.例如,在英文中,e的出现机率最高,而z的出现概率则最低.当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26).用普通的表示方法时,每个

解析C++哈夫曼树编码和译码的实现_C 语言

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

数据结构——赫夫曼树

1 基本概念 赫夫曼树(Huffman Tree)又称为最优树,是一类带权路径长度最短的树.本文仅讨论最优二叉树. 树的路径长度是指从树根到树中其余各个结点的路径长度之和.对具有n个结点的二叉树而言,完全二叉树具有最短的树的路径长度. 若在二叉树中,树叶结点带有权值,则有:结点的带权路径长度定义为从树根到该结点之间的路径长度与该结点上所带权值之积. 若树中有n个树叶结点,且每个树叶结点均带有权值,则有:树的带权路径长度定义为树中所有树叶结点的带权路径长度之和,可记为: 有时,也将树的路径长度称为

请问霍夫曼压缩图片时图片应该转换为什么格式?

问题描述 本人小白,目前想用C#写一个图片压缩的程序,用霍夫曼算法的时候出现了一点问题,我不知道应该把图片转为为什么格式来作为霍夫曼算法的输入,查网上资料也没个准,不知道是string.byte数组还是什么别的.求大家点拨. 解决方案 解决方案二:byte[]或者Stream.解决方案三:引用1楼sp1234的回复: byte[]或者Stream. Base64String格式可以吗?解决方案四:不可以!虽然你可以在传递时使用Base64String,但运算时还是要解码的解决方案五:引用3楼xu

用c++构造哈夫曼树-用c++构建一个哈夫曼树

问题描述 用c++构建一个哈夫曼树 可以输入字符个数和权值,中间要有层次遍历,带头文件,打印哈夫曼树,编码和译码,有源代码,可以用c-free运行的那种,求各位大神帮忙解答,要完整的代码拜托了 解决方案 http://download.csdn.net/detail/amini_qiang/9231621 看看这个满足你的需要不,可在vs2010中直接运行