免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1334 | 回复: 4
打印 上一主题 下一主题

[求助]哪儿来的EOF?濒临崩溃边缘~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-29 13:55 |只看该作者 |倒序浏览
做一个哈夫曼编码的小程序,开始用递归方法查表进行解码,正常;后来试试不用递归来写,就改了一下。。。发现。。。。结果不同,凭空多出一个字节?!用cmp比较。。。报告"cmp: EOF on ...",怎么回事儿??

后来输出每一个保存到文件里字节,发现两种写法的输出完全一样,字节数也一样,可是。。。费解的就是非递归方法产生的文件就是会多一个字节,而且用winhex看不到那个字节。。。。。基本上愤怒的要崩溃了。。。。求大侠指点。

相关的定义部分

  1. typedef unsigned char  Symbol;       /* any byte is encodable */
  2. typedef struct HuffNode *HuffTree;
  3. struct HuffNode {
  4.         Bool  isExt;           /* is this an external node? */
  5.         Symbol  sym;           /* defined if isExt only */
  6.         HuffTree  branch[2];   /* defined if !isExt only */
  7. };

  8. // Open bit stream for reading from fp
  9. BitStream BitStream_OpenRead(FILE *fp);

  10. // Open bit stream for writing to fp
  11. BitStream BitStream_OpenWrite(FILE *fp);

  12. // Transfer nbits (0..CHAR_BIT) from data to bs
  13. void BitStream_Put(BitStream bs, unsigned char data, int nbits);

  14. // Return nbits (0..CHAR_BIT) from bs
  15. unsigned char BitStream_Get(BitStream bs, int nbits);
复制代码


递归版本

  1. static unsigned char traverse_and_decode(HuffTree t, BitStream bs){
  2.         if (t->isExt == FALSE){
  3.                 int j = BitStream_Get(bs, 1);
  4.                 return traverse_and_decode(t->branch[j], bs);
  5.         }
  6.         return t->sym;
  7. }

  8. void HuffTree_Decode(HuffTree t, FILE *fin, FILE *fout, int num_bytes)
  9. {
  10.         int i;
  11.         BitStream bsi, bso;

  12.         bsi = BitStream_OpenRead(fin);
  13.         bso = BitStream_OpenWrite(fout);

  14.         for (i=0; i<num_bytes; i++)
  15.                 BitStream_Put(bso, traverse_and_decode(t, bsi) , CHAR_BIT);

  16.         BitStream_Close(&bso);
  17.         BitStream_Close(&bsi);
  18. }
复制代码


非递归版本

  1. void HuffTree_Decode(HuffTree t, FILE *fin, FILE *fout, int num_bytes)
  2. {
  3.         int i, j;
  4.         HuffTree tt;
  5.         BitStream bsi, bso;

  6.         bsi = BitStream_OpenRead(fin);
  7.         bso = BitStream_OpenWrite(fout);

  8.         for (i=0; i<num_bytes; i++){
  9.                 tt=t;
  10.                 while (tt->isExt==FALSE){
  11.                         j = BitStream_Get(bsi,1);
  12.                         tt=tt->branch[j];
  13.                 }

  14.                 BitStream_Put(bso, tt->sym, CHAR_BIT);
  15.         }

  16.         BitStream_Close(&bso);
  17.         BitStream_Close(&bsi);
  18. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-05-29 14:05 |只看该作者
其他部分完全相同。。。死活就是多一个byte。。。还不知道多了个啥。。。。气死人吧。。。唉。。。。我都快哭了。。。。实在看不出什么地方有区别。。。。。。。

论坛徽章:
0
3 [报告]
发表于 2006-05-29 16:03 |只看该作者
还是没有人理。。。唉。。。。真的就这么难吗? 这里把全部代码贴出来。。。两组的区别就在我说的那个函数。。。。如果您找到原因,麻烦一定跟我说一声。。。。拜谢

此外,说明一下欧的环境:cygwin+gcc3.4.4

a2.rar

34.66 KB, 下载次数: 24

完整代码

论坛徽章:
0
4 [报告]
发表于 2006-05-29 17:15 |只看该作者
估计是你控制文件结尾的原因。
递归的程序判断到了文件尾就没有继续读,而非递归程序到了文件尾继续读了,把文件的结束标志读了进来。

论坛徽章:
0
5 [报告]
发表于 2006-05-29 20:22 |只看该作者
楼上的。。。谢谢你的关注。。。不过你可能还没搞清楚状况。。。。如果真的有兴趣帮我,可以仔细看下源代码(其实只需要看第一篇帖子的内容就好了)。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP