0

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は、私が宣言した従業員構造体の属性です。

4

1 に答える 1

1

どのプラットフォームで使用しているのかはわかりませんが、MingWgcc4.6.2を使用してMS-Windowsで問題を再現できます。問題は、 Windowsが。の後にバッファをフラッシュしないfwrite()ことです。追加

fflush(fq);

fwrite()これを解決するための呼び出しの後。

https://github.com/afester/StackOverflow/tree/master/updateRecordで私のSSCCEも参照してください

于 2012-11-06T07:29:43.947 に答える