while(!feof(fp))死循环,该怎么解决?

structstudentpaixu(structstudenttest1){intn=0,i,j;FILE*fp;fp=fopen("student.dat","r+"... struct student paixu(struct student test1)
{
int n=0,i,j;
FILE *fp;
fp=fopen("student.dat","r+");
if(user.n==0)
{
for(i=0;i<7;i++)
{
for(j=1;j<3;j++)
test1.cj[i][j]=1;
}
return test1;
}
else
{
while(!feof(fp))
{
if(fread(&test,length,1,fp)!=1)
break;
for(i=0;i<7;i++)
{
if(test.cj[i][0]<test1.cj[i][0])
{
test1.cj[i][2]=test.cj[i][2];
test.cj[i][2]++;
n++;
}
else if(test.cj[i][0]==test1.cj[i][0])
{
test1.cj[i][2]=test.cj[i][2];
test1.cj[i][1]=test.cj[i][1]++;
n++;
}
else if(test.cj[i][0]>test1.cj[i][0]&&test1.cj[i][2]<test.cj[i][2])
test1.cj[i][2]=test.cj[i][2]+test.cj[i][1];
}
if(n!=0)
{
fseek(fp,-length,SEEK_CUR);
fwrite(&test,length,1,fp);
}

}
fclose(fp);
return test1;
}
}
展开
 我来答
对床话雨
2014-04-19 · TA获得超过1636个赞
知道小有建树答主
回答量:171
采纳率:100%
帮助的人:152万
展开全部
fseek(fp,-length,SEEK_CUR);
fwrite(&test,length,1,fp);
fflush();   //<--------这里需要添加一个调用,就能解决问题。

================================================


由于你给的代码不是很全,一些变量甚至可能是全局变量,一些比较有什么意义,也不太清楚。但你这里有一个很明显的问题是,fread()与fwrite()在交替使用.

    if(fread(&test,length,1,fp)!=1) break;
    ......
    fseek(fp,-length,SEEK_CUR);
    fwrite(&test,length,1,fp);


当代码中利用同一个文件指针进行读写交替调用时,写入操作之后需要调用fflush(),刷新一下文件流缓存,否则后继的文件的读写操作会出现意料之外的结果,读的时候,出现总是读到缓存中的内容,没有读取到真正文件,写的时候,也没有真正写入到文件中。这时候,feof()也无法检测到真正的文件尾,这是一切都是fread()和fwrite()缓存机制导致的问题。

============================================


很简单读写交替调用,需要在读写操作之后调用fflush(),也可以调用fseek(),fsetpos(),rewind(),它们内部都会刷新缓存.从而保存后续操作缓存不会出错。

============================================


你的代码之所以跳不出while循环,就是因为feof()不会返回文件结束标志。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式