繁体   English   中英

C读写中的二进制文件

[英]Binary files in C Reading & Writing

我想在C语言中使用带有二进制文件的结构。我读了一个人结构文件。 每个人都有一个属性is_a_winner,is_runner_up如果is_a_winner为true,我应该在“奖品”字段中添加金,如果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);
    }
}

您提供的代码可以归结为:

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文件中)的位置,然后向前写吧...如果我理解你的意图是要更新你刚才读的记录,你seeked在错误的方向。 如果您的第一个记录是记录0,则读取后的位置是记录1,然后您尝试记录2,然后进行写操作。 哎呀! 而是使用以下命令查找: fseek(fp, -itemSize, SEEK_CUR); 向后移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM