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

如何从文件内容填充数组并排序?多属性对应数组填充实现

解决方案:读取文件属性到数组并排序

首先得指出你代码里的一个常见坑:不要用!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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:22