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

如何读取文件并将数据存入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:01:20