[求助]编写哈夫曼压缩程序时遇到的一个很奇怪的问题
自己用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次这样的现象。
已确认是编码模块的问题,谁能帮忙解释一下,谢谢。。。