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

读取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;
}

修正关键点说明

  1. 动态控制读取次数:用while循环替代固定次数的for循环,循环条件是「数组还没满」并且「fscanf成功读取了3个数据」——fscanf的返回值是成功读取的变量个数,返回3才说明拿到了完整的一行数据,避免无效循环。
  2. 返回有效数据条数:让read函数返回实际读取到的条目数,这样print_array只打印有效数据,不会处理未赋值的数组元素。
  3. 修正文件检查逻辑:现在正确判断*file == NULL,同时调整了文件指针的传递方式,保证main函数能拿到正确的文件句柄。
  4. 合理管理文件资源:把文件关闭的逻辑移到main函数,更符合资源所有权的管理逻辑。

这样修改后,不管你的源文件里有多少条数据(只要不超过MAX),都会正确读取并打印,不会再出现末尾重复的问题。

备注:内容来源于stack exchange,提问作者Veanty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:27:34