如何基于名对二进制文件中的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
相关产品推荐
相关产品推荐

