这段代码有可能导致系统死机吗?请高手指点,错在那里啊,急死了,在线等

roamstar 2003-08-18 03:52:12
int search_msg(char bar[],char temp1[],char sn[],char style[],char model[],int mode)
{
FILE *fp;
FILE *index;
int exist;
long i,j,mid,ret;
char rec[150],t;
Datatype data;
datap td;
ret=0;
exist=0;
i=1;

if(mode)
{
DataNUM=fsize(indexfile);
fp=fopen(checkfile,"rb");
index=fopen(indexfile,"rb");
}
else
{
DataNUM=fsize(nindex);
fp=fopen(ndata,"rb");
index=fopen(nindex,"rb");
}
if(!fp)
{
putestr(0,1,"File open Error!");
fclose(fp);
fclose(index);
return 0;
}
fseek(index,0,0);
j=0;
i=DataNUM/20;
printf("\nDFSize:%ld",i);
gch();
mid=0;
exist=0;
while(j<=i)
{
mid=(i+j)/2;
printf("\nAll:%ld,ID:%ld",i,mid);
fseek(index,mid*20,0);
fread(td.barcode,16,1,index);
fseek(index,mid*20+16,0);
fread(&td.point,4,1,index);
ret=strcmp(bar,td.barcode);
printf("\n%s:%ld",td.barcode,td.point);
if(ret==0)
{
exist=1;
break;
}
else if(ret>0)
{
j=mid+1;
}
else if(ret<0)
{
i=mid-1;
}
}
if(exist)
{
fseek(fp,td.point,0);
fread(&t,1,1,fp);
fseek(fp,td.point,0);
memset(rec,0x0,150);
memset(data.serialN,0x0,9);
memset(data.name,0x0,51);
memset(data.model,0x0,17);
memset(data.barcode,0x0,14);
memset(data.style,0x0,30);
fread(rec,(int)t,1,fp);
getdata(rec,5,(int)rec[1],data.serialN);
getdata(rec,5+(int)rec[1],(int)rec[2],data.name);
getdata(rec,5+(int)rec[1]+(int)rec[2],(int)rec[3],data.model);
getdata(rec,5+(int)rec[1]+(int)rec[2]+(int)rec[3],(int)rec[4],data.style);
memset(temp1,0x0,52);
strcpy(temp1,data.name);
strcpy(sn,data.serialN);
strcpy(style,data.style);
strcpy(model,data.model);
fclose(fp);
fclose(index);
printf("%s","\nFind!");
gch(0);
return 1;
}
else
{
fclose(fp);
fclose(index);
printf("%s","\nNo Find!");
gch(0);
return 0;
}
}
...全文
50 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rtdb 2003-08-21
  • 打赏
  • 举报
回复
memset(data.serialN,0x0,9);
memset(data.name,0x0,51);
memset(data.model,0x0,17);
memset(data.barcode,0x0,14);
memset(data.style,0x0,30);

这种语句太危险了。 外面改了大小你都不知道。
所有的数字应改为宏定义。

或者
memset(data.name,0x0,sizeof(data.name));

其实一句就可以:
memset(&data,0x0,sizeof(data));
fixopen 2003-08-21
  • 打赏
  • 举报
回复
该程序中,所有的str*都改成mem*。如果逻辑上没有问题,就应该是正常的。
earthquake 2003-08-21
  • 打赏
  • 举报
回复
你能确保fread(td.barcode,16,1,index);
读出来的数据是0结束的字符串吗?
最好在比较前给td.barcode的尾巴加个0。
roamstar 2003-08-19
  • 打赏
  • 举报
回复
up
roamstar 2003-08-19
  • 打赏
  • 举报
回复
在一个已经排好序的索引文件,根据已经给定的条件进行二分查找,

回复人: oo() ( ) 信誉:100 2003-08-19 09:18:00 得分:0


index在open后没判断是否成功。
虽然我没有判断index是否打开成功,但是我可以确保他打开成功了,只在在二分查找的循环中莫名其妙的死机的,程序什么反应都没有了


oo 2003-08-19
  • 打赏
  • 举报
回复
index在open后没判断是否成功。
longenic 2003-08-19
  • 打赏
  • 举报
回复
能不能说一说你编这个程序的目的呢?
太长了一点。。。还有是什么错误??
widewave 2003-08-19
  • 打赏
  • 举报
回复
fread(&(td.point),4,1,index); // try it
roamstar 2003-08-19
  • 打赏
  • 举报
回复
up
roamstar 2003-08-18
  • 打赏
  • 举报
回复
GGJJ们帮 忙啊
roamstar 2003-08-18
  • 打赏
  • 举报
回复
是的,
fwbmail 2003-08-18
  • 打赏
  • 举报
回复
sizeof(td.point)==4?
roamstar 2003-08-18
  • 打赏
  • 举报
回复
其他中有一句很怪,总是读不出数据,
fseek(index,mid*20+16,0);
fread(&td.point,4,1,index);
文件里在这种位置里,是有数据的,可是偏偏读出来是为O,而且这个函数运行时居然导致系统死机,请问GGJJ们有办法解决吗???

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧