循环计数器在c中使用fread丢失奇数

时间:2013-01-09 23:15:21

标签: c loops

大家好我有这个功能告诉我数据文件中有多少条记录。 但无论何时我运行它只读取偶数记录

例如:如果我有0条记录则输出0

有1条记录,输出0

有2条记录,它输出1

用3输出1

用4输出2

(对于客户和产品数据库项目而言 customer是一个struct,filep是指向文件customerfile的指针,该文件在此代码上面定义) 我在日食上运行,只能使用gnu89 / 90方言,如果这是一个差异

   int CusFileNumber(void)
{
    customer tempcus;
    filep = fopen(customersFile, "r");
    fseek (filep,0,SEEK_SET);
    int counter =0;

    while(!feof(filep))
    {
        fread(&tempcus,sizeof(customer),1,filep);
        printf ("%d",counter);
        counter ++;
    }
    fclose(filep);
    return (counter-1);
}

所以我更新了代码以摆脱feof

看起来像这样

int CusFileNumber(void)
{
    customer tempcus;
    filep = fopen(customersFile, "r");
    fseek (filep,0,SEEK_SET);
    int counter =0;

    while(fread(&tempcus, sizeof(customer), 1, filep) == 1)
    {
        printf ("%d",counter);
        counter ++;
    }
    fclose(filep);
    return (counter);
}

但这次我仍然遇到同样的问题,它不计算偶数

意味着在每个奇数计数器上增加1但在文件中有偶数个记录时保持不变 (它的.dat文件btw)

1 个答案:

答案 0 :(得分:1)

  1. 你不能那样使用feof(3)。它只会告诉您流是否已经结束,而不是它即将结束。您需要将fread调用放入循环条件并检查其返回值:

    while (fread(&tempcus, sizeof(customer), 1, filep) == 1)
    

    完全摆脱feof来电。

  2. 您确定sizeof(customer)符合文件中的真实内容吗?

  3. 为什么要在递增之前打印counter

  4. 为什么要返回counter - 1而不是counter