huffman压缩解压文件【代码】
距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug。其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自己也是思考,学习,调试了很久,慢慢地清除了一个一个bug。一周的课后时间都花在这上面了,也算有了一点心得吧。下面一一说来吧--
这个程序有两个最关键的点,一个是上次写的哈夫曼编码,那个是基础,另外一个就是位操作,这个是最关键的,具体来讲位操作就是如何把一个01字符串变成内存中实际存放的0和1, 下面还会对这里做出更多解释。
整个程序以二进制的形式读写文件,不是以文本形式读写,因为所有文件在计算机中都是以二进制的形式存放的,以这种最根本的形式能够达到对所有文件操作的目的,当然,文件夹是不可以的,目前对任何形式的单个文件都可以压缩和解压,但是压缩率和文件本身密切相关,不同文件压缩率可能相差很大,甚至某些文件压缩完比原文件还大,这并不是bug,而是在我的这种方法下理论上就可能出现这种情况。另外,该程序只是为了以最简单的方式来实现哈夫曼压缩,所以没仔细考虑时间复杂度,可能压缩某些比较大的视频文件或其他文件需要很长的时间,原因是以二进制的形式读写文件本身就要花费很多时间。想想一个100M的文件都有100 * 1024 *1024 字节,每次读取一个字节,都要上亿次,还要考虑构建哈夫曼树,得到哈夫曼编码,写入文件等等,时间复杂度自然会很高了。这也是我第一次通过自己的实践这么直观地认识到时间复杂度的重要性,也就是算法的重要性。想想我们平时在电脑上用的那些压缩软件,压缩效率是那么高,还特别快,人家肯定用到了很好的算法。
之前我在看C++Primer的时候对流这一章没怎么去看,所以一开始就不知道怎么以二进制的形式操作文件,这里还是要对文件流fstream比较了解才能写这个程序,特别是ifstream的 read()函数以及ofstream的write()函数,怎么去理解fout.write((char *)(&obj), sizeof(obj))中的char*这种强制类型转换呢?这玩意我想了很久,网上看了挺多文章的,没看到有人说过这个,按我的理解,应该就是把任何数据转换成它们在内存中的表示(0和1),然后以字节为单位,把每8位转换成256个ASCII码中的一个字符,然后再写入文件,以这种方式来达到用二进制的形式把任何一种数据写入文件或者从文件读取( fin.read((char *)(&obj), sizeof(obj)) ),然后注意这里的第一个参数必须是引用。还有一个在操作文件流容易错的地方就是操作完记得关闭这个流,断开和相应文件的连接,防止下次另外一个流和同一个文件关联,你不可能对一个文件同时进行读和写的操作。另外对文件流指针,以及二进制文件结束标志都要清楚,很多错误都源于对这些细节不清楚。比如以二进制形式读取时,总发现最后多读了一点东西,仔细调试一下,发现多读的这个东西输出是两个连在一起的空格,查看ASCII发现是十进制255对应的那个字符,八进制为'\377',叫做nbsp,全称是Non-breaking space or no-break space(http://www.theasciicode.com.ar/),在查询相关知识得知它就是任何二进制文件的结束标志,文件流指针读到这个字符时就知道这个文件结束了,这样一来似乎就豁然开朗了,还有得明白文件指针的移动原理,文件指针时刻这个下一个将被操作的字符,每次以字节为单位移动,所以在用到。fin.get()函数时,每次调用ifstream的这个成员函数时,文件指针就向后移动一个字节,所以我们以二进制形式读取一个文件的每一个字符应该这样读
huffman压缩解压文件【代码】的更多相关文章
- 通过SharpZipLib来压缩解压文件
在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更 ...
- .NET使用ICSharpCode.SharpZipLib压缩/解压文件
SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...
- C#使用SharpZipLib压缩解压文件
#region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> // ...
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...
- 哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- linux压缩解压文件
首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件 ...
- Freebsd下压缩解压文件详解
压缩篇: 把/usr/webgames目录下的文件打包.命名为bak.tar.gz 放到/usr/db-bak目录里 下面命令可以在任意目录执行.无视当前目录和将要存放文件的目录.tar -zcvf ...
- tar压缩解压文件
查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...
随机推荐
- SQL SERVER的检查点checkpoint
1 什么是检查点 数据修改操作 都是在 内存中的数据页进行修改,每次修改后并没有立即把这些页面写入磁盘,而是等到一定时期,数据库引擎对数据库发起 检查点命令,这时,该命令就会创建一个已知的正常点,把当 ...
- HTML文档中使用JavaScript和css
HTML文档中使用JavaScript和css 引入css 内嵌式引入:将css代码写在HTML中的style标签里面 <!DOCTYPE html> <html> <h ...
- 定制Maven的ArcheType
根据需要定制Maven的ArcheType的好处不言而喻了,我就不再啰嗦.定制一般通过从Maven的项目构建,比手动构建省去了配置文件的编写.资源文件的复制等繁琐的操作,下面我们就说下从Maven项目 ...
- Oracle 字符集设置
因为装Linux系统时选择的是英文版,所以当需要测试中文数据库时会出现乱码,这里记录一下我修改字符集的操作. 一些命令: 1.查看sqlplus客户编码: $ echo $NLS_LANG 2.查看 ...
- Mac OSX Sierra WiFi connecting problem
吐槽一下,苹果的质量管控越来越差了. Mac OSX Sierra有时突然或升级后会遇到wifi不停重连连不上问题,现象为不停地连接wifi. 网上有人说删除 /Library/Preferences ...
- HTM5新手学习的一些日常总结,相互交流和相互学习。
第一天 一.HTML--网页的源码(超文本标签语言) HTML标签 标签式是HTML最基本单位和最重要的组成. 使<和>扩起来 标签都是闭合的(规范) HTML标签属性 是标签的一部分,用 ...
- 很污的机器学习:从xhamster网站找到喜欢的片子
前言 最近迷上了看黄片(大雾).每次总是去搜索想看的片子,什么asian porn anal pussy 什么的我都不知道. 搜索着搜索着我手也累了,而且我喜欢的片子也是有一定的特征的,我不想把所有的 ...
- VueJs学习路线
对于这个东西,我本人也是初学者,收集一些学习资源的链接,用于个人资源的学习,也分享给大家 lavyun的博客 里面有一些给初学者的建议,学习路线 http://www.cnblogs.com/smar ...
- 使用git部署服务器
每回上传服务器是把我的web项目打包成war上传到服务器根目录下,总是觉得很麻烦,并且每次就算只添加或修改了一个文件,都要把整个服务器war包上传.于是我学着用git部署我的web项目 下面是详情: ...
- Linux centos7环境下安装Nginx
Linux centos7环境下安装Nginx的步骤详解 1. 首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...