You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于名对二进制文件中的Student结构体数组进行原地冒泡排序?

二进制文件中基于Student名字的冒泡排序实现问题

结构体定义

我定义了以下两个结构体:

typedef struct Student {
    char name[50];
    int roll_no;
    char telephone[50];
    char address[50];
} Student;

包含Student数组的注册表结构体:

typedef struct SReg {
    Student arr[MAX_STUDENTS];
    int curr_length;    // curr_length存储学生注册表中的当前学生数量,最大值为100
} SReg;

现有二进制文件导出代码

我已经通过以下代码将SReg变量sr中的Student数组导出为二进制文件:

FILE *file = fopen(fname, "wb");
if (file == NULL) {
    printf("The file cannot be created!");
    return 0;
}
if (fwrite(sr, sizeof(Student), sr->curr_length, file) != sr->curr_length) return 0;
fclose(file);
return 1;

内存中的排序逻辑

在内存中,我可以通过以下方式提取Student的名字(Firstname)并进行比较排序:

char *ptr_i = NULL;
char *ptr_j = NULL;
// 跳过姓氏,获取名字(name格式为“姓氏, 名字”,例如:Rogers, Steve)
ptr_i = strchr(sr->arr[i].name, ' ') + 1;
ptr_j = strchr(sr->arr[j].name, ' ') + 1;

// 比较两个名字,若需要则交换结构体
if (strcmp(ptr_i, ptr_j) > 0) {
   Student temp;
   temp = sr->arr[i];
   sr->arr[i] = sr->arr[j];
   sr->arr[j] = temp;
}

核心需求与疑问

我需要对二进制文件中的结构体数组原地执行冒泡排序,排序依据是Student的名字字段。目前我已经能通过以下代码获取文件中的结构体总数:

fseek(file, 0, SEEK_END);
// 获取文件中的记录总数
int total = ftell(file)/sizeof(Student);
rewind(file);

接下来我计划用两层嵌套for循环实现冒泡排序,但不清楚如何通过fseek、fread、fwrite等函数访问文件中指定位置的结构体字段,进而完成比较与交换操作。

内容的提问来源于stack exchange,提问作者Techie5879

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:15:35