0

こんにちは、私はこの関数を使用して、データ ファイルにいくつのレコードがあるかを教えてくれます。ただし、実行するたびに偶数レコードのみを読み取ります

例: 0 件のレコードがある場合、0 を出力します

1レコードで0を出力します

2つのレコードで1を出力

3で1を出力

4 で 2 を出力します

(ところで、顧客および製品データベースプロジェクトの場合、顧客は構造体であり、filepはこのコードの上で定義されているファイルcustomerfileへのポインターです)私はEclipseで実行しており、それが違いを生む場合にのみ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ファイル)

4

1 に答える 1

1
  1. そんな使い方はできませんfeof(3)。ストリームがすでに終了しているかどうかを通知するだけで、もうすぐ終了することは通知しません。fread呼び出しをループ条件に入れて、その戻り値を確認する必要があります。

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

    feof電話を完全に取り除きます。

  2. sizeof(customer)ファイルの内容と本当に一致していますか?

  3. counterインクリメントする前に印刷するのはなぜですか?

  4. なぜcounter - 1代わりに戻ってくるのcounterですか?

于 2013-01-09T23:16:01.570 に答える