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

C语言周期表项目:读取txt文件数据无法加载全部元素

周期表数据加载问题解决方案

问题核心原因

你的程序仅能加载到54号元素,主要由以下三个问题导致:

  • 数组下标越界:C语言数组下标从0开始,struct element e[118]的有效下标范围是0~117,但你循环中用line从1到118访问e[line],e[118]属于越界访问,会触发未定义行为,可能中断数据读取。
  • fscanf返回值判断错误:fscanf返回成功匹配的参数个数,你仅判断返回值非0,但若某次读取失败(如返回EOF或匹配数不足4),后续循环会在错误的文件指针位置继续读取,导致全部失败。
  • fflush(stdin)的未定义行为:fflush仅对输出流有效,对输入流stdin调用属于未定义行为,不同编译器处理逻辑不同,可能干扰读取流程。

修改后的代码

#include "periodic_table.h"
#include <stdio.h>

int populate(void)
{
    struct element
    {
        int atomic_num;
        char name[15];
        char symbol[5];
        float mass_num;
    };

    // 数组下标从0开始,对应118个元素
    struct element e[118];

    FILE *ptr = fopen("periodic_table.txt", "r");
    if (ptr == NULL)
    {
        printf("No file to read from.\nExiting...\n");
        return 1;
    }

    int count = 0;
    // 循环读取直到填满数组或文件结束
    while (count < 118)
    {
        int ret = fscanf(ptr, "%d %s %s %f", 
                        &e[count].atomic_num, 
                        e[count].name, 
                        e[count].symbol, 
                        &e[count].mass_num);
        
        if (ret == 4)
        {
            // 成功读取一条记录
            printf("%d record: %d %s %s %.2f\n", count+1, e[count].atomic_num, e[count].name, e[count].symbol, e[count].mass_num);
            count++;
        }
        else if (ret == EOF)
        {
            // 文件提前结束的提示
            printf("File ended early, read %d elements total.\n", count);
            break;
        }
        else
        {
            // 格式错误,跳过当前行
            printf("Invalid format at line %d, skipping this line.\n", count+1);
            // 清空当前行剩余内容,避免影响下一次读取
            while (fgetc(ptr) != '\n' && !feof(ptr));
        }
    }

    fclose(ptr);
    return 0;
}

额外检查项

  1. 确认periodic_table.txt中54号元素之后的行格式完全符合atomic_number name symbol mass_number,没有元素名称带空格、数值格式错误等问题(%s会在空格处停止读取,导致参数匹配失败)。
  2. 确保程序运行时能正确访问到periodic_table.txt文件(比如路径正确,没有权限问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:24:55