使用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
错误原因
- 未检查文件打开状态:如果
matrix.txt不存在、路径错误或无读取权限,fopen会返回NULL,后续直接对空指针调用feof、fscanf等函数会触发段错误。 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
相关产品推荐
相关产品推荐

