0

我很想在 C 中使用带有二进制文件的结构。我读了一个人的结构文件。每个人都有一个属性 is_a_winner,is_runner_up 如果 is_a_winner 为 true 我应该在 Prize 字段中添加 Gold,如果 is_runner_up 为 true,则添加 Silver,否则添加铜牌。它适用于某些结构,但不适用于其他结构。我认为这可能与文件中“光标”的定位有关。

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,然后您写入。哎呀!相反,寻找:fseek(fp, -itemSize, SEEK_CUR);向后移动。

于 2012-12-03T18:11:05.227 回答