标题:[求助]编写哈夫曼压缩程序时遇到的一个很奇怪的问题
只看楼主
lostworld_gy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-30
 问题点数:0 回复次数:2 
[求助]编写哈夫曼压缩程序时遇到的一个很奇怪的问题
自己用C语言写了一个哈弗曼算法程序,部分编码模块如下

typedef struct nodeb     /*编码数组*/
{
    int num;
    int n;         /*编码长度*/
    int a[50];  /*用来存储编码,如0111011*/         
}NODEB;

int FileCode(FILE *fpt)                   /*文件编码与保存模块*/
{
    unsigned char ch;
    unsigned char tem,tem2;   /*建立临时文件用于临时存储编码*/
    int i,n,m,k;     /*用n检查char tem是否存满,用m检查编码是否读取完毕*/
    FILE *fpb;
    char f_path[100];
    printf("\n/>Creat:(6/6)Please Press  Code File path(Output):  ");
    scanf(" %s",f_path);                                                             /*输入待打开的文件名*/
    if((fpb=fopen(f_path,"wt"))==NULL)
    {
        printf("\n\n/>Can't Write File\n/>Anykey return to menu");
        getch();
        menu();
    }
    n=0;
    m=0;
    ch=(unsigned char)fgetc(fpt);
    tem=0;                        /*将char型变量置为00000000*/
    while(ch!=255)                /*若文件未读取完*/
    {
        while(n<N)                    /*若字符未存满*/
        {
            if(ch==255)
                break;
            if(m<b[ch].n)        /*若读入数据未存储完,则存入tem的第n位*/
            {
                tem2=0;
                if(b[ch].a[m]==1)
                    tem2++;
                for(k=1;k<=N-1-n;k++)
                    tem2*=2;
                tem+=tem2;
                m++;
                n++;
            };
            if(m==b[ch].n) /*若编码存储完毕,则读取下一个字符编码*/
            {
                ch=(unsigned char)fgetc(fpt);
                m=0;
            };
        };
        if(ch==255)
            break;
        n=0;
        fputc((unsigned char)tem,fpb);
        tem=0;
    };
    while(m<b[M].n)
    {
        while(n<N)   /*如果n未存满则继续*/
        {
            if(m<b[M].n)  /*如果编码未存完*/
            {
                tem2='a'<<(N+1);
                if(b[M].a[m]==1)
                tem2++;
                for(k=1;k<=N-1-n;k++)
                tem2*=2;
                tem+=tem2;
                m++;
                n++;
            }
            if(m==b[M].n)
                break;
        }
        if(m==b[M].n)
            break;
        n=0;
        fputc((unsigned char)tem,fpb);
        tem='a'<<N;
    }
    fputc((unsigned char)tem,fpb);
    fclose(fpb);
    return(0);
}

编译通过,对比文件的二进制码发现编码后生成的文件会出现部分的乱码,对体积较小的文件却没有出现这种情况,

如:编码前:
一、norun

norun是个恶作剧软件,它只有一个可执行文件,12288字节大小,运行于Win98/ME下。运行后要求回答三道算数题。虽然题目很简单,但是
一旦答错,机器将连续重启动12次(每次都有提示)后恢复正常。除此之外,没有其他影响。因此,norun是个真正的恶作剧软件,对大家的
威胁并不大。不过,如果机器真的重新启动12次的话,也够恐怖的!所以也要掌握应对它的方法。

最直接的方法是你回答对那三道题就可以了。不要担心,是小学二年级的都会做的算数题。请看这三道:

是不是很容易回答?不用我再公布答案了吧?^_^如果你回答对了,就会出现对话框,点击“确定”软件运行结束。由于你回答对了,所以不
会出现连续重启动12次这样的现象。

编码后:


一、norun

norun是个恶作剧软件,它只有一个可执行文件,12288字节大小,运行于Win98/ME下。运行后要求回答三道算数题。虽然题目很简单,但是
一旦答错,机器将连续重启动12次(每次都有提示)后恢复正常。除此之外,没有其他影响。因此,norun是个真正的恶作剧软件,对大家的
威胁并不大。不过,如果机器真的重新启动12次的话,也够恐怖的!所以也要掌握应对它的方法。

最直接的方法是中蠱一鸲阅侨?捞饩涂梢粤恕2灰?P模?切⊙Ф?昙兜亩蓟嶙龅乃闶?狻G肟凑馊?溃?

是不是很容易回答?不用我再公布答案了吧?^_^如果你回答对了,就会出现对话框,点击“确定”软件运行结束。由于你回答对了,所以不
会出现连续重启动12次这样的现象。



已确认是编码模块的问题,谁能帮忙解释一下,谢谢。。。
搜索更多相关主题的帖子: 哈夫曼 编写 压缩 
2008-11-30 20:10
lostworld_gy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-30
得分:0 
谁能给个答复啊。。。苦等了一天
2008-12-01 10:55
biancheng1998
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-11-30
得分:0 
不怪不怪,是你太菜而已,呵呵!!!
2008-12-06 19:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-247085-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.110703 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved