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

使用函数将文本文件数据读取至结构体数组的技术咨询

完成读取文本文件到结构体数组的C语言程序

我来帮你把这个程序补全并修正几个容易踩坑的地方,确保它能正确把文件里的人物信息存入结构体数组。首先咱们先梳理下现有代码里的小问题:

  • main() 应该显式声明返回类型 int(C标准要求)
  • 原代码按换行符计数的逻辑不适用你的场景——你的目标文件是一行包含多个人的信息,按换行符算出来的lines没法正确得到人数
  • 缺少 stdlib.h 头文件,没法使用malloc和free函数
  • 没有StoreInArray函数的声明和实现
  • 没做文件打开、内存分配的错误检查,容易引发程序崩溃

接下来是补全并修正后的完整代码:

#include <stdio.h>
#include <stdlib.h> // 加入malloc、free所需的头文件

typedef struct {
    char name[100];
    int age;
    float height;
} PERSON;

// 提前声明StoreInArray函数,避免编译报错
void StoreInArray(PERSON *arr, FILE *fp, int count);

int main() { // 显式声明int返回类型
    PERSON *X = NULL;
    FILE *f;
    int personCount = 0;
    char tempName[100];
    int tempAge;
    float tempHeight;

    // 打开文件,务必检查是否成功
    f = fopen("filename.txt", "r");
    if (f == NULL) {
        printf("无法打开文件,请检查文件路径或权限\n");
        return 1;
    }

    // 先预读一次,计算文件里的总人数
    // 每次成功读取3个字段,就代表一个人的信息
    while (fscanf(f, "%s %d %f", tempName, &tempAge, &tempHeight) == 3) {
        personCount++;
    }
    rewind(f); // 将文件指针移回开头,准备正式读取

    // 为结构体数组分配内存,同时检查分配是否成功
    X = (PERSON*)malloc(personCount * sizeof(PERSON));
    if (X == NULL) {
        printf("内存分配失败\n");
        fclose(f); // 失败前要关闭文件,避免资源泄漏
        return 1;
    }

    // 调用自定义函数存储数据到数组
    StoreInArray(X, f, personCount);

    // 可以加个测试打印,验证读取结果
    printf("成功读取的人物信息:\n");
    for (int i = 0; i < personCount; i++) {
        printf("姓名:%s | 年龄:%d | 身高:%.1f\n", X[i].name, X[i].age, X[i].height);
    }

    // 用完资源记得释放:先释放动态内存,再关闭文件
    free(X);
    fclose(f);

    return 0;
}

// 实现StoreInArray函数:从文件读取数据到结构体数组
void StoreInArray(PERSON *arr, FILE *fp, int count) {
    for (int i = 0; i < count; i++) {
        // 直接把文件内容读取到数组对应的结构体元素中
        fscanf(fp, "%s %d %f", arr[i].name, &arr[i].age, &arr[i].height);
    }
}

关键细节说明:

  • 文件打开检查:必须判断fopen的返回值,如果文件不存在、路径错误或权限不足,程序能及时给出提示,避免后续操作空指针
  • 正确计数人数:用fscanf按格式读取,只要成功读取3个字段就代表一个人的信息,不管内容是一行还是多行都能正确计数
  • 内存分配检查:malloc可能因内存不足失败,必须检查返回值,避免后续操作空指针导致崩溃
  • 资源释放:动态分配的内存和打开的文件都要在程序结束前释放/关闭,避免内存泄漏和系统资源占用

这样修改后,程序就能稳定读取文件里的人物信息并存储到结构体数组中了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:05:47