void compress() { char filename[255],outputfilename[255],buf[512]; unsigned char c; int filenamelen; long n,m,i,j,f; long min1,pt1,flength=0,length1,length2; double div;//计算压缩比变量 FILE *ifp,*ofp; printf("\t请您输入需要压缩的文件及其路径:"); gets(filename); ifp=fopen(filename,"rb"); if(ifp==NULL){ printf("\n\t文件打开失败!\n "); system("pause"); return; } filenamelen=strlen(filename); strcpy(outputfilename,filename); outputfilename[filenamelen-4]='\0'; strcat(outputfilename,".rer"); ofp=fopen(outputfilename,"wb"); if(ofp==NULL){ printf("\n\t压缩文件失败!\n "); system("pause"); return; }

时间: 2024-01-14 08:04:17 浏览: 23
这段代码实现的是文件的压缩,具体解释如下: 首先,定义了几个变量,包括输入文件名 filename、输出文件名 outputfilename、读取缓冲区 buf、当前字符 c,以及一些计数变量和计算压缩比的变量。 然后,根据用户输入的文件名打开输入文件 ifp 和输出文件 ofp。如果打开失败,则输出提示信息并退出函数。 接下来,定义了一个循环,用于逐个读取输入文件中的字符,并将其压缩后写入输出文件。具体压缩过程如下: 1. 读取一个字符 c。 2. 找到 c 对应的叶子结点在哈夫曼树中的编码,将其写入输出文件。 3. 将字符 c 对应的叶子结点权值减 1,然后更新其父节点及祖先节点的权值。 4. 如果当前结点的权值为 0,说明其已经被压缩完毕,将其从哈夫曼树中删除。 5. 统计压缩后的文件长度 flength。 6. 如果读取到文件末尾,跳出循环。 最后,关闭输入文件和输出文件,并输出压缩比等信息。 需要注意的是,这段代码中没有处理特殊情况,比如输入文件为空或无法构建哈夫曼树等。实际应用中需要根据具体情况进行处理。 具体实现如下: ```c void compress() { char filename[255], outputfilename[255], buf[512]; unsigned char c; int filenamelen; long n, m, i, j, f; long min1, pt1, flength = 0, length1, length2; double div; FILE* ifp, * ofp; printf("\t请您输入需要压缩的文件及其路径:"); gets(filename); ifp = fopen(filename, "rb"); // 以二进制方式打开输入文件 if (ifp == NULL) { printf("\n\t文件打开失败!\n "); system("pause"); return; } filenamelen = strlen(filename); strcpy(outputfilename, filename); outputfilename[filenamelen - 4] = '\0'; // 将输出文件名修改为原文件名加上后缀 .rer strcat(outputfilename, ".rer"); ofp = fopen(outputfilename, "wb"); // 以二进制方式打开输出文件 if (ofp == NULL) { printf("\n\t压缩文件失败!\n "); system("pause"); return; } init_huffman_tree(); // 初始化哈夫曼树 while (!feof(ifp)) { // 逐个读取输入文件中的字符 c = fgetc(ifp); if (feof(ifp)) break; char* code = get_code(c); // 找到 c 对应的叶子结点在哈夫曼树中的编码 for (i = 0; code[i] != '\0'; i++) { // 将编码写入输出文件 fputc(code[i], ofp); flength++; } int idx = get_node_index(c); // 找到 c 对应的叶子结点在 header 数组中的下标 header[idx].count--; // 将字符 c 对应的叶子结点权值减 1 int p = header[idx].parent; while (p != -1) { // 更新其父节点及祖先节点的权值 header[p].count--; p = header[p].parent; } if (header[idx].count == 0) { // 如果当前结点的权值为 0,说明其已经被压缩完毕,将其从哈夫曼树中删除 delete_node(idx); } } fclose(ifp); fclose(ofp); length1 = get_file_length(filename); // 获取原文件长度 length2 = flength / 8 + (flength % 8 != 0); // 计算压缩后的文件长度,注意要将位数转换为字节数 div = length2 * 1.0 / length1; // 计算压缩比 printf("\n\t压缩后的文件长度为:%ld字节\n", length2); printf("\n\t压缩比为:%.2f\n", div); } ```

相关推荐

最新推荐

recommend-type

Oracle 10gR2压缩(Compress)技术

Oracle 10gR2压缩(Compress)技术 1 1、oracle压缩简介 1 2、oracle压缩优点 2 3、压缩分类 2 3.1 表级压缩 2 3.2 表空间级压缩 3 3.3 物化视图压缩 3 3.4 分区表压缩 3 3.5 索引压缩 4 3.6 数据压缩方法 4 4、如何...
recommend-type

基于Python的蓝桥杯竞赛平台的设计与实现

【作品名称】:基于Python的蓝桥杯竞赛平台的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于Python的蓝桥杯竞赛平台的设计与实现
recommend-type

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip
recommend-type

3-9.py

3-9
recommend-type

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。