存储在文件中的记录

时间:2014-03-21 09:11:39

标签: c++ file pointers

“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);
    }
}

4 个答案:

答案 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);
    }