读取TXT文件数据存入结构体数组时末尾数据重复的问题求助
读取TXT文件数据存入结构体数组时末尾数据重复的问题求助
你好,我看了你的代码和问题描述,很快就找到了问题的核心,咱们一步步来分析和解决:
问题根源
你的结构体数组大小设为MAX=5,但源文件只有3条有效数据。你用for (int i = 0; i < m; i++)固定循环5次,当读到第4、5次时,文件已经没有数据了,fscanf会读取失败,但你没有处理这个失败的情况——此时name和grade还保留着上一次(第3次)读取到的值,你又把这些旧值复制到结构体数组里,自然就出现了末尾重复的现象。
另外代码里还有个明显的小错误:if (path== NULL)完全不对,应该判断file == NULL,因为path是用户输入的字符串,不可能为NULL,我们要检查的是fopen是否成功打开了文件。
修正后的代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <ctype.h> #define MAX 5 // max array size typedef struct { char name[80]; int grade; } para; // 修改:返回实际读取到的有效数据条数 int read(FILE **file, para tab[], int m) { char path[80]; printf("Enter the file path: "); scanf_s("%s", path, 80); *file = fopen(path, "r"); if (*file == NULL) { printf("Error opening file\n"); return 0; // 返回0表示没读到数据 } else { int i = 0; int index; char name[80]; int grade; // 关键:判断fscanf的返回值,只有成功读取3个数据时才继续 while (i < m && fscanf(*file, "%d %80s %d", &index, name, &grade) == 3) { strcpy(tab[i].name, name); tab[i].grade = grade; i++; } return i; // 返回实际读取的条数 } } void print_array(para tab[], int count){ // 只打印实际读取到的有效数据 for (int i = 0; i < count; i++) { printf("%s %d\n", tab[i].name, tab[i].grade); } } int main() { FILE* file; para tab[MAX]; int read_count = read(&file, tab, MAX); print_array(tab, read_count); if (file != NULL) { fclose(file); } return 0; }
修正关键点说明
- 动态控制读取次数:用
while循环替代固定次数的for循环,循环条件是「数组还没满」并且「fscanf成功读取了3个数据」——fscanf的返回值是成功读取的变量个数,返回3才说明拿到了完整的一行数据,避免无效循环。 - 返回有效数据条数:让
read函数返回实际读取到的条目数,这样print_array只打印有效数据,不会处理未赋值的数组元素。 - 修正文件检查逻辑:现在正确判断
*file == NULL,同时调整了文件指针的传递方式,保证main函数能拿到正确的文件句柄。 - 合理管理文件资源:把文件关闭的逻辑移到main函数,更符合资源所有权的管理逻辑。
这样修改后,不管你的源文件里有多少条数据(只要不超过MAX),都会正确读取并打印,不会再出现末尾重复的问题。
备注:内容来源于stack exchange,提问作者Veanty
相关产品推荐
相关产品推荐

