“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);
}
}
答案 0 :(得分:4)
feof
函数导致循环再次进入预期。如需完整说明,请阅读:
Why is “while ( !feof (file) )” always wrong?
答案 1 :(得分:0)
feof()
仅在您尝试读取或超过文件末尾时才返回true。
当您阅读完最后一个数据后,您仍然在该文件的有效区域内。
当在下一次迭代中检查条件时,它仍然是相同的。你会再次阅读,这次是在文件结束后。所以你读零字符,输入"没有"进入你的字符串(所以它保持不变),然后再次打印。只有在那之后(因为你传递了文件的末尾),feof()
才会返回true。
答案 2 :(得分:0)
这将有效:
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;
}
}
答案 3 :(得分:0)
feof()的目的不是检查下一次读取是否会到达文件末尾。 feof()的目的是区分读取错误和到达文件末尾。如果 fread()返回0,则调用 feof / ferror 进行操作。
话虽如此,你应该替换它:
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);
}