王鑫 2010年06月19日 星期六 21:17 | 2051次浏览 | 2条评论
其实,早就该写这么一个东西,不过应该冠以“实验报告”的标题,可惜我想说的话,和那种玩意儿不太沾边儿。所以只草草地交给了老师两张A4,不得不在心里说声抱歉了。(当然,那些东西,我并不确定他会看.........)
这次课程设计的主要内容,就是根据霍夫曼压缩算法,实现一个简单的压缩程序。
我遇到了很多的挫折,用接近两个月的时间也没能完成别人两星期左右的工作,确实很受打击,所以首先分享一下过程中遇到的各种问题。最初的错误在于对压缩的理解,虽然霍夫曼说是改变编码的长度,但是读是八位的,写是八位的,这个怎么改变呢?当然后来自己想通了,把几个不够八位的拼在一起就行了,不过当时这个问题困扰了我两三天。接下来就是实现霍夫曼编码了,这个貌似没有什么问题,但是真正做起来又有很多小错误,记忆最深的便是,顺序逆序的确定,从第一位到第七位编码,还是编好一位往前退一位。然后就是真正的去压缩了,简单地说,就是读一个字符,把它的霍夫曼编码存起来,到存够八位后,就往压缩文件里写一个字符,这个还好,就是最后容易丢掉部分字符,在蹦出循环之后,还要把最后存储的也许不够八位的字符再写一遍。这个思路建立后,就能压缩简单的文件了,但是后来发现,对除txt之外的很多文件并不适用。然后就是无休止的测试,最后明白,像word,pdf之类的文件,可能是要存储更多的字体或是颜色大小等信息,所以256种组合(八位嘛)都会被应用到。而我的终止标志正好在对应数组的第256的位置(这个数组就256个空间),哎,不够用啊,就多加了个一就解决了,可是改了好久。
好了,做好一个文件的压缩后,我连门就要来做文件夹的压缩了。像之前一样,一开始就遇到了问题——我不明白那个FindFirstFile和FindNextFile函数,于是又是一轮熟悉和调试。后来明白,这个文件返回的子文件夹前面会多出“.”和“..”这两个文件夹名(貌似是给父文件夹保留的),然后读名字的时候去掉这两个的就行了。再然后就是用递归实现深搜了,还不错,但是因为要把信息存入数组里,所以函数的入口要带着i作为数组记录到第几位的标志。然后对i的处理又有一系列烦人的小问题。当然这个搞定后,和前面的压缩文件拼到一起,就基本实现压缩的功能了。
解压缩相对简单,我同学有句话说得很好:“压缩没问题,解压缩就没问题”。所以一般我解压缩有问题的时候都回到压缩那边找原因,而事实上错误也基本出在压缩的部分。
综上所述,不难看出,压缩单个文件的错误,主要出在理解方面。对别人的想法,对计算机的工作机制的理解错误,导致了开始的失败。而在文件夹压缩时,错误则出在熟悉函数的问题。因为不熟悉将要用到的函数,所以自己的很多想法不能轻易实现,耗费了不必要的时间和精力。
当然,实事求是地说,能自己慢慢地从头写个程序,也让我收获颇多。对于以前的怠惰,很是警醒。也许在我的世界,编程注定不是一件快乐的事,但我至少看到惊喜和挫折并存,这已经让我心满意足了。
Zeuux © 2024
京ICP备05028076号
回复 张明蔚 2010年06月21日 星期一 14:01
回复 王鑫 2010年06月21日 星期一 22:14