保存在文件中的记录

records stored in a file

本文关键字:记录 文件 存在 保存      更新时间:2023-10-16

在" 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);
    }