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; }
额外检查项
- 确认
periodic_table.txt中54号元素之后的行格式完全符合atomic_number name symbol mass_number,没有元素名称带空格、数值格式错误等问题(%s会在空格处停止读取,导致参数匹配失败)。 - 确保程序运行时能正确访问到
periodic_table.txt文件(比如路径正确,没有权限问题)。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

