【问题标题】:fwrite in c going in an infinite loopc中的fwrite进入无限循环
【发布时间】:2012-11-06 06:14:13
【问题描述】:

我正在尝试使用 fread 和 fwrite 更新 .DAT 文件中的记录,但不知何故循环无限运行。我的代码是:

FILE *fq;
Employee eme;
long int recsize_eme;
recsize_eme=sizeof(eme);

fq=fopen("EME.DAT","rb+");
if(fq==NULL)
{
    fq=fopen( "EME.DAT","wb+");
    if(fq==NULL)
    {
        printf("Can't Open File");
        exit(EXIT_FAILURE);
    }
}

rewind(fq);
while(fread(&eme,recsize_eme,1,fq)==1)
{
    if (compare_date(eme.pre_pay_date)==0 && compare_date(eme.pol_end_date)!=0)
    {
        int date[3];
        int n;
        n = sscanf(eme.pre_pay_date, "%d/%d/%d", &date[0], &date[1], &date[2]);
        if(date[1]!=12)
        {
            date[1]++;
        }
        else
        {
            date[1]=1;
            date[2]++;
        }

        snprintf(eme.pre_pay_date, sizeof(eme.pre_pay_date), "%d/%d/%d", date[0], date[1], date[2]);
        printf( eme.pre_pay_date );
        if (eme.pre_status!=0)
        {
            eme.pre_payment = eme.premium;
        }
        else
        {
            eme.pre_payment = eme.premium + eme.pre_payment;
        }
        printf( "%f %f\n",eme.premium,eme.pre_payment );
        fseek(fq,-recsize_eme,SEEK_CUR);
        fwrite(&eme,recsize_eme,sizeof(eme)/recsize_eme,fq);
    }
}
fclose(fp);

如果正确更新值但在写入时会继续无限打印值的函数。 eme 是我声明的 struct Employee 的一个属性。

【问题讨论】:

  • 可能检查 fseek() 和 fwrite() 的返回值会有所帮助
  • 为什么需要 fseek()?
  • 尝试写入不同的文件。在同一个文件中读取和写入会导致问题。如果您正在读取的文件中写入,则可能没有遇到EOF!

标签: c fwrite fread


【解决方案1】:

您没有说您在哪个平台上,但我可以使用 MingW gcc 4.6.2 在 MS-Windows 上重现您的问题。问题是Windows does not flush the buffersfwrite() 之后。添加

fflush(fq);

fwrite() 调用后解决这个问题。

另见我的SSCCEhttps://github.com/afester/StackOverflow/tree/master/updateRecord

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多