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;
}
} 展开
{
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;
}
} 展开
1个回答
展开全部
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()不会返回文件结束标志。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询