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

使用C语言fscanf读取文件时触发Segmentation Fault问题求助

解决C语言读取矩阵文件时的段错误问题

问题代码

int main() {
    FILE *matrix_r;
    matrix_r=fopen("matrix.txt","r");
    double x;char c;
    while(feof(matrix_r)){
        fscanf(matrix_r,"%lf%c",&x,&c);
        printf("%lf%c",x,c);
    }
    fclose(matrix_r);

    return 0;
}

运行上述代码读取以下matrix.txt文件时,出现Segmentation Fault (core dumped)错误:

0.000000,876.671546,448.879717,1349.827396
876.671546,0.000000,1319.195209,964.193445
448.879717,1319.195209,0.000000,1741.628261
1349.827396,964.193445,1741.628261,0.000000

错误原因

  1. 未检查文件打开状态:如果matrix.txt不存在、路径错误或无读取权限,fopen会返回NULL,后续直接对空指针调用feof、fscanf等函数会触发段错误。
  2. feof使用逻辑错误:feof不会提前预判文件末尾,只有当读取操作尝试越过文件末尾时才会置位。用它作为循环条件会导致最后一次读取失败后仍进入循环,操作无效数据或指针。

修正后的代码

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

int main() {
    FILE *matrix_r = fopen("matrix.txt", "r");
    // 检查文件是否成功打开
    if (matrix_r == NULL) {
        fprintf(stderr, "无法打开文件matrix.txt\n");
        return EXIT_FAILURE;
    }

    double x;
    char c;
    // 用fscanf返回值判断是否成功读取预期的两个元素(double和char)
    while (fscanf(matrix_r, "%lf%c", &x, &c) == 2) {
        printf("%lf%c", x, c);
    }
    // 处理文件末尾可能无尾随字符的数值
    if (!feof(matrix_r)) {
        if (fscanf(matrix_r, "%lf", &x) == 1) {
            printf("%lf\n", x);
        }
    }

    fclose(matrix_r);
    return EXIT_SUCCESS;
}

修正说明

  • 增加文件打开失败的判断和错误提示,避免操作空指针
  • 改用fscanf的返回值作为循环条件,确保每次都成功读取到指定格式的数据
  • 额外处理文件末尾可能存在的无尾随字符的数值,避免遗漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35