如何从文件内容填充数组并排序?多属性对应数组填充实现
解决方案:读取文件属性到数组并排序
首先得指出你代码里的一个常见坑:不要用!feof(filePtr)作为循环条件——feof是在你尝试读取超出文件末尾后才会返回true,这会导致最后一次循环读取无效数据。正确的做法是直接检查fscanf的返回值,确认是否成功读取了3个字段。
下面是完整的实现代码,包含文件读取、数组填充和排序的逻辑:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_ENTRIES 100 // 根据你的实际需求调整最大条目数 // 定义存储每个属性的数组 char licensePlates[MAX_ENTRIES][20]; // 车牌,假设最长20字符 char vehicleTypes[MAX_ENTRIES][20]; // 类型(Man/Auto) char names[MAX_ENTRIES][20]; // 名称 int entryCount = 0; // 实际读取的条目数量 // qsort的比较函数:按车牌升序排序(如果需要其他排序规则,修改这里即可) int compareByLicensePlate(const void *a, const void *b) { // 因为我们要排序的是数组的索引,所以这里传入的是索引的指针 int idxA = *(int*)a; int idxB = *(int*)b; return strcmp(licensePlates[idxA], licensePlates[idxB]); } int main() { FILE* filePtr = fopen("vehicle.txt", "r"); if (filePtr == NULL) { perror("Failed to open file"); return 1; } // 读取文件内容,填充数组 while (entryCount < MAX_ENTRIES && fscanf(filePtr, "%s %s %s", licensePlates[entryCount], vehicleTypes[entryCount], names[entryCount]) == 3) { entryCount++; } fclose(filePtr); // 如果需要排序,我们可以创建一个索引数组,避免移动大字符串数组 int indices[MAX_ENTRIES]; for (int i = 0; i < entryCount; i++) { indices[i] = i; } // 使用qsort排序索引数组 qsort(indices, entryCount, sizeof(int), compareByLicensePlate); // 输出排序后的结果 printf("Sorted entries by license plate:\n"); for (int i = 0; i < entryCount; i++) { int idx = indices[i]; printf("%s %s %s\n", licensePlates[idx], vehicleTypes[idx], names[idx]); } return 0; }
关键细节说明:
- 数组大小:
MAX_ENTRIES定义了最大可存储的条目数,如果你的文件很大,建议改用动态内存分配(比如malloc/realloc)来避免数组溢出。 - 循环条件:
fscanf(...) == 3确保每次都成功读取了3个字段,同时加上entryCount < MAX_ENTRIES防止数组越界。 - 排序优化:直接排序字符串数组会频繁移动大内存块,这里用索引数组排序,只移动整数索引,效率更高。如果需要按其他字段排序(比如名称),只需要修改
compareByLicensePlate函数的逻辑即可。 - 错误处理:添加了文件打开失败的错误提示,方便排查问题。
如果你需要按其他规则排序(比如按类型+名称),或者需要处理更复杂的文件格式,随时调整代码逻辑就好~
内容的提问来源于stack exchange,提问作者user9746835
相关产品推荐
相关产品推荐

