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

C语言读取文件内容至结构体时触发段错误的问题排查与修正咨询

解决读取score.txt时的段错误问题

嘿,我来帮你拆解下问题所在——你的代码逻辑和目标文件的格式完全不匹配,这才直接触发了段错误。咱们一步步来修正:

问题根源

  • 文件格式与读取方式不匹配:你的score.txt是纯文本格式(内容是名字 分数的字符串序列),但你用了fread这种二进制读取函数。fread是用来读取之前用fwrite写入的二进制结构体数据的,根本不适合处理文本内容。
  • 错误读取size值:代码开头先读取了size变量,但你的文本文件里根本没有这个二进制格式的长度值,读出来的size是一堆乱码,循环时会疯狂越界访问数组,直接触发段错误。
  • 缺少文件打开检查:如果score.txt不存在或者没有读取权限,fopen会返回NULL,后续对空指针的操作会直接崩溃。

修改后的完整代码

#include <stdio.h>
#include <stdlib.h>

struct player{ 
    char name[30]; 
    int score; 
};

// 返回成功读取的玩家数量,失败返回-1
int load(struct player list[]){
    FILE* fp = fopen("score.txt", "r");
    // 必须检查文件是否打开成功
    if(fp == NULL){
        perror("Failed to open score.txt");
        return -1;
    }

    int count = 0;
    // 用fscanf读取文本格式的名字和分数:%s读无空格名字,%d读整数分数
    // 循环到读满10个玩家或文件结束
    while(count < 10 && fscanf(fp, "%s %d", list[count].name, &list[count].score) == 2){
        count++;
    }

    fclose(fp);
    return count;
}

// 测试示例
int main(){
    struct player players[10];
    int read_count = load(players);
    if(read_count == -1){
        return 1;
    }

    for(int i = 0; i < read_count; i++){
        printf("Player %d: Name = %s, Score = %d\n", i+1, players[i].name, players[i].score);
    }
    return 0;
}

关键修改说明

  • 改用fscanf处理文本:完美匹配你文本文件的名字 分数格式,%s专门读取无空格的字符串(符合你结构体的名字要求),%d读取整数分数,返回值为2表示成功读取一组完整数据。
  • 增加错误检查:用perror打印具体错误原因(比如文件不存在、权限不足),方便调试。
  • 动态计数读取量:既可以处理正好10个玩家的情况,也能兼容文件内容不足10个的场景,彻底避免数组越界。
  • 返回实际读取数:让调用者清楚知道成功加载了多少数据,逻辑更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:22:32