#include <stdio.h>

struct Student {
    int id;
    char name[20];
    float score;
};

int main() {
    FILE *fp;
    struct Student temp;
    int targetIndex = 1;  // 要修改的学生下标（第2名）

    // 以读写模式打开二进制文件
    fp = fopen("students.dat", "rb+");  // "rb+"：二进制读写
    if (fp == NULL) {
        printf("无法打开文件！\n");
        return 1;
    }

    // 定位到目标学生（计算偏移量）
    // 偏移量 = 下标 × 单个结构体大小
    fseek(fp, targetIndex * sizeof(struct Student), SEEK_SET);

    // 读取原数据
    fread(&temp, sizeof(struct Student), 1, fp);
    printf("修改前第%d名学生：%d, %s, %.1f\n", 
           targetIndex + 1, temp.id, temp.name, temp.score);

    // 重新定位（因读取后位置标记已移动）
    fseek(fp, targetIndex * sizeof(struct Student), SEEK_SET);

    // 修改成绩并写入
    temp.score = 95.0;
    fwrite(&temp, sizeof(struct Student), 1, fp);
    printf("修改后第%d名学生：%d, %s, %.1f\n", 
           targetIndex + 1, temp.id, temp.name, temp.score);

    fclose(fp);

    // 验证修改结果
    fp = fopen("students.dat", "rb");
    fseek(fp, targetIndex * sizeof(struct Student), SEEK_SET);
    fread(&temp, sizeof(struct Student), 1, fp);
    printf("验证修改结果：%d, %s, %.1f\n", temp.id, temp.name, temp.score);
    fclose(fp);

    return 0;
}
