如何读取文件并将数据存入struct数组?C语言新手求助
读取文件数据并存入struct数组的修正方案
你的代码存在几个致命问题,导致无法正常工作,以下是问题说明和修正后的代码:
关键问题分析
- fscanf参数错误:
fscanf要求传入变量的地址来存储读取的数据,你直接传递变量值,会引发内存访问错误。比如station[i].site_id_num必须改为&station[i].site_id_num,数组元素同理,需加&取地址。 - 未检查文件打开状态:如果
fopen失败(比如文件不存在),会返回NULL,后续操作会直接崩溃,必须先判断文件是否成功打开。 - printf格式错误:换行符需用
\n,你代码里的换行写法会导致编译报错。 - main返回值错误:程序正常执行完成应返回
0,1通常代表异常退出。
修正后的完整代码
#include <stdio.h> typedef struct { int site_id_num; int day_of_month[14]; int wind_speed[14]; int temperature[14]; } measured_data_t; int main() { FILE *read; measured_data_t station[5]; // 检查文件是否成功打开 read = fopen("data", "r"); if (read == NULL) { printf("无法打开文件\n"); return 1; } // 读取每个站点的14天数据 for(int i = 0; i < 5; i++) { for(int j = 0; j < 14; j++) { // 注意每个变量前加&取地址 fscanf(read, "%d %d %d %d", &station[i].site_id_num, &station[i].day_of_month[j], &station[i].wind_speed[j], &station[i].temperature[j]); } } // 输出验证数据 for(int i = 0; i < 5; i++) { printf("站点ID: %d\n", station[i].site_id_num); for(int j = 0; j < 14; j++) { printf("第%d天: 风速%d, 温度%d\n", station[i].day_of_month[j], station[i].wind_speed[j], station[i].temperature[j]); } printf("------------------------\n"); } fclose(read); return 0; }
额外注意事项
- 你的数据文件中,5000站点的第12行写成了
500 12 11 16,这是笔误,会导致该站点的ID不一致,建议修正为5000 12 11 16。 - 优化建议:每个站点的14行数据中ID是重复的,你可以在读取每个站点的第一行时存储ID,后面13行只读取日期、风速、温度,减少重复赋值,示例如下:
for(int i = 0; i < 5; i++) { // 读取第一行的ID和第一天数据 fscanf(read, "%d %d %d %d", &station[i].site_id_num, &station[i].day_of_month[0], &station[i].wind_speed[0], &station[i].temperature[0]); // 读取剩下13天的数据,不需要再读ID for(int j = 1; j < 14; j++) { int temp_id; // 临时存储重复的ID,不需要保存 fscanf(read, "%d %d %d %d", &temp_id, &station[i].day_of_month[j], &station[i].wind_speed[j], &station[i].temperature[j]); } }
内容的提问来源于stack exchange,提问作者LunaticCoder
相关产品推荐
相关产品推荐

