距离上次写完哈夫曼编码已经过去一周了,这一周都在写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压缩解压文件【代码】的更多相关文章

  1. 通过SharpZipLib来压缩解压文件

    在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更 ...

  2. .NET使用ICSharpCode.SharpZipLib压缩/解压文件

    SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...

  3. 【转载】.NET压缩/解压文件/夹组件

    转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...

  4. C#使用SharpZipLib压缩解压文件

    #region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> // ...

  5. 跨平台的zip文件压缩处理,支持压缩解压文件夹

    根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...

  6. 哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

  7. linux压缩解压文件

    首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件 ...

  8. Freebsd下压缩解压文件详解

    压缩篇: 把/usr/webgames目录下的文件打包.命名为bak.tar.gz 放到/usr/db-bak目录里 下面命令可以在任意目录执行.无视当前目录和将要存放文件的目录.tar -zcvf ...

  9. tar压缩解压文件

    查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...

随机推荐

  1. for循环与foreach的区别

    for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...

  2. JNI之C初探

    JNI是Java Native Interface的缩写,从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI一开始是为了本地已编译语言,尤其 ...

  3. String和intern()浅析

    String a = new String("aa"),代表在堆内存中,创建了一个字符串对象,变量a指向该对象,而该对象又指向在常量池中的字符串常量.而String a = &qu ...

  4. String字符串截取跟替换经典案例

    分享下今天的一个面试题吧!不算有难度,但是没做出来 题目:将String  str="姓名:武亚伟,年龄:27,地址:西安市": 输出结果为:姓名=武亚伟 年龄=27 地址=西安市 ...

  5. 1218: [HNOI2003]激光炸弹

    1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1139  Solved: 542[Submit][Statu ...

  6. adt的问题An internal error has occurred. After scene creation, #init() must be called

    这个问题困扰了我好久,我也尝试去百度.google无济于事啊,让我寝食难安,太难受了,我把它贴出来,希望后人不绕弯子... 解决办法: 即可,解决这一个问题,现在酣畅淋漓,挥洒自如的capy代码了

  7. canvas基础—图形变换

    1.canvas转换方法 1.1canvas转换方法 二.canvas实现图形的中心点旋转 step1:获取canva元素并指定canvas的绘图环境 var canvas=document.getE ...

  8. golang RWMutex读写锁分析

    RWMutex:是基于Mutex实现的读写互斥锁,一个goroutine可以持有多个读锁或者一个写锁,同一时刻只能持有读锁或者写锁 数据结构设计: type RWMutex struct { w Mu ...

  9. Java中Comparable和Comparator你知多少?

    前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...

  10. ZJOI2017 Day3 滚粗记

    私のZJOI Day3 2017-3-21 07:52:53 今天,考了人生当中的第一次省选(虽然只是普及组三等奖但仍然有幸能体会一下).据胡老师说,这就是来体验一下被大神虐--真的是这样,听课听不懂 ...