使用函数将文本文件数据读取至结构体数组的技术咨询
完成读取文本文件到结构体数组的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
相关产品推荐
相关产品推荐

