0

C のバイナリ ファイルでスタクトを使用するのに苦労しています。人々の構造体のファイルを読み込んでいます。各人には属性 is_a_winner、is_runner_up is_a_winner が true の場合は賞品フィールドにゴールドを追加する必要があります。is_runner_up が true の場合はシルバーを追加し、それ以外の場合はブロンズを追加します。一部の構造体では機能しますが、他の構造体では機能しません。ファイル内の「カーソル」の位置に関係していると思います。

struct prizelist{
    char name[10];
    int is_a_winner;
    int is_runner_up;
    int age;
    char prize[20];
};

void addPrize() {
    FILE *fp;
    if ((fp = fopen("prize.out", "rb+"))!=NULL) {
        size_t itemSize = sizeof(struct prizelist);
        struct prizelist item;
        fread(&item,1,itemSize, fp);
        while (!feof(fp)) {
            if (item.is_a_winner) {
                strcpy( item.prize, "Gold" );   
            } else if (item.is_runner_up) { 
                strcpy( item.prize, "Silver" );         
            } else {
                strcpy( item.prize, "Bronze" );             
            }
            fseek(fp, itemSize, SEEK_CUR);
            fwrite(&item, itemSize, 1, fp);
            fread(&item,1,itemSize, fp);
        }
        fclose(fp);
    }
}
4

1 に答える 1

0

提示されたコードは、次のように要約できます。

fread(&item,1,itemSize, fp);
while (!finished) {
  fseek(fp, itemSize, SEEK_CUR);
  fwrite(&item, itemSize, 1, fp);
  fread(&item,1,itemSize, fp);

問題は fseek() 呼び出しにあります。SEEK_CURファイル内の現在の ( ) 位置から相対シークを行ってから、ファイルに書き込みを行っています... 読み取ったばかりのレコードを更新するというあなたの意図が理解できれば、シークの方向が間違っています。最初のレコードがレコード 0 で、読み取り後の位置がレコード 1 である場合、レコード 2 を探してから書き込みます。おっと!代わりに、seek:fseek(fp, -itemSize, SEEK_CUR);で後方に移動します。

于 2012-12-03T18:11:05.227 に答える