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

如何在C语言中将文本文件行拆分后存入对应结构体数组?

嘿,我来帮你搞定这个问题!看起来你需要用C语言读取文本文件的每一行,逐个填充到结构体数组里对吧?我给你一步步拆解,附上完整的示例代码,保证你能直接上手。

第一步:先定义你的结构体

首先得把结构体的结构明确,根据你说的字段,我们可以这么定义:

typedef struct {
    char model[50];  // 给车型名留足够空间,避免溢出
    float version;
    int price;
    char color[30];
} Car;

第二步:核心逻辑——读取文件并填充数组

这里的关键是先统计文件行数(这样能准确创建对应大小的结构体数组),然后逐行解析数据填充到数组里。我推荐用fgets+sscanf的组合,比直接用fscanf更可靠,能避免换行符残留的问题。

完整代码示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char model[50];
    float version;
    int price;
    char color[30];
} Car;

int main() {
    // 1. 打开文件,先检查是否成功
    FILE *file = fopen("cars.txt", "r");
    if (!file) {
        perror("Failed to open file");  // 打印具体错误原因
        return 1;
    }

    // 2. 先遍历一次文件,统计总行数
    int lineCount = 0;
    char buffer[256];  // 临时存每行的内容
    while (fgets(buffer, sizeof(buffer), file)) {
        lineCount++;
    }
    // 把文件指针移回开头,准备第二次读取
    rewind(file);

    // 3. 分配结构体数组(动态分配更灵活,也可以用静态数组如Car cars[lineCount];)
    Car *cars = malloc(lineCount * sizeof(Car));
    if (!cars) {
        perror("Failed to allocate memory");
        fclose(file);
        return 1;
    }

    // 4. 逐行读取并填充结构体
    int currentIndex = 0;
    while (fgets(buffer, sizeof(buffer), file) && currentIndex < lineCount) {
        // 用sscanf解析每行数据,格式要和文件里的内容完全匹配!
        // 假设你的文件每行格式是:model version price color(比如"F150 5.7 28000 white")
        int parsedFields = sscanf(buffer, "%s %f %d %s", 
                                 cars[currentIndex].model, 
                                 &cars[currentIndex].version, 
                                 &cars[currentIndex].price, 
                                 cars[currentIndex].color);
        
        // 检查是否成功解析了4个字段,避免脏数据
        if (parsedFields != 4) {
            printf("Warning: Invalid data in line %d, skipping...\n", currentIndex + 1);
            continue;
        }
        currentIndex++;
    }

    // 5. 验证读取结果(可选,用来调试)
    printf("Successfully read %d cars:\n", currentIndex);
    for (int i = 0; i < currentIndex; i++) {
        printf("Car %d: Model=%s, Version=%.1f, Price=%d, Color=%s\n",
               i+1, cars[i].model, cars[i].version, cars[i].price, cars[i].color);
    }

    // 6. 收尾工作:释放内存+关闭文件
    free(cars);
    fclose(file);
    return 0;
}

几个关键注意事项

  • 字段格式匹配:确保sscanf的格式符和你文件里的内容完全对应,如果车型名包含空格(比如"Ford F150"),那%s就不行了,得换成%[^ ]这样的格式符(比如%49[^ ],限制长度避免溢出)。
  • 内存安全:结构体里的char数组要设足够大的长度,防止读取过长的字符串导致缓冲区溢出。
  • 错误处理:一定要检查文件是否打开成功、内存是否分配成功,不然程序容易崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:15:52