我想在C中使用带有二进制文件的结构。我读了一个人的结构文件。每个人都有一个属性is_a_winner,is_runner_up如果is_a_winner为true我应该在Prize字段中添加Gold,如果is_runner_up为true,则添加Silver,否则添加bronze。它适用于某些结构但不适用于其他结构。我认为这可能与文件中“光标”的定位有关。
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);
}
}
答案 0 :(得分: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);
向后移动。