在" somefile.dat "中存储了10条记录,但是下面的程序打印了11个名字。什么走错了吗?
void main()
{
struct student
{
char name[30], rollno[6];
}stud;
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
}
}
feof
函数导致循环比预期的多进入一次。要了解完整的解释,请阅读这里:
为什么"while (!feof (file))"总是错的?
feof()
仅当您尝试在文件末尾或之后读取时返回true。
当你读了最后一个数据,你仍然在文件的有效区域。
当在下一次迭代中检查条件时,它仍然是相同的。因此,您将再次读取,这次是在文件末尾之后。因此,您读取0个字符,将"nothing"输入到字符串中(因此它保持不变),并再次打印它。只有在此之后(因为您通过了文件的末尾),feof()
才会返回true。
可以:
void main()
{
struct student
{
char name[30], rollno[6];
}stud;
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
if ( feof(fp) )
break;
}
}
feof()的目的不是检查下一次读是否到达文件的末尾。feof()的目的是区分读取错误和到达文件末尾。如果fread()返回0,则调用feof/error来采取一些操作。
话虽如此,你应该替换这个:
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
}
与这个: FILE *fp = fopen(“somefile.dat”,”r”);
fread(&stud, sizeof(stud), 1 , fp);
while(!feof(fp))
{
puts(stud.name);
fread(&stud, sizeof(stud), 1 , fp);
}