C语言fscanf触发段错误,提示lab4.dat缺失但文件实际在同目录
问题根因
- 最核心的错误是文件打开后的判空逻辑使用了赋值运算符
=而非比较运算符==:
你写的if (infile = NULL)会直接将infile强制赋值为NULL,且该判断条件永远为假,哪怕文件实际打开失败也不会进入错误退出分支。后续fscanf读取NULL的文件指针直接触发段错误,也不会弹出你写的文件打开错误提示。 - 次要问题:
- 预先定义了文件名宏
IN_FILE_NAME、OUT_FILE_NAME,但实际fopen时没有使用,硬编码了文件名,存在代码维护风险 - 业务逻辑顺序错误:先把梯形计算结果写入输出文件,再打印表头,最终输出的txt文件中数据会出现在表头上方,不符合阅读习惯
- 写入每行计算结果时没有加换行符,会导致所有数据挤在同一行
- 预先定义了文件名宏
修复后的代码
#include <stdio.h> #include <stdlib.h> #define IN_FILE_NAME "lab4.dat" #define OUT_FILE_NAME "lab4.txt" int main(void) { double h, s1, s2, area; FILE * infile; FILE * outfile; infile = fopen(IN_FILE_NAME , "r"); // 改为==做判等比较,也可以直接写if (!infile) 效果等价 if (infile == NULL){ printf("Error on fopen input file\n"); exit (EXIT_FAILURE); } outfile = fopen(OUT_FILE_NAME, "w"); if (outfile == NULL){ printf("Error on fopen output file\n"); exit (EXIT_FAILURE); } // 先输出表头再写数据 fprintf(outfile, "\nTyler Rice. Lab 4. \n\n"); fprintf(outfile, "Area of Trapezoid \n\n"); fprintf(outfile, " Height Side1 Side2 Area \n"); fprintf(outfile, "-------- --------- --------- ---------- \n"); while ((fscanf(infile, "%lf%lf%lf", &h, &s1, &s2)) == 3) { area = 0.5 * h * (s1 + s2); fprintf(outfile, "%7.2f %7.2f %7.2f %10.3f\n", h, s1, s2, area); // 每行数据末尾加换行符,避免所有数据挤在同一行 } fprintf(outfile, "\n\n"); fclose(infile); fclose(outfile); return EXIT_SUCCESS; }
额外注意点
如果修复后仍然提示文件不存在,可以检查程序运行时的工作目录是否和源文件目录一致:部分IDE默认的程序运行目录不是源文件所在目录,需要手动将dat文件放到程序运行生成的可执行文件同目录下,或者在IDE中配置工作目录为源文件目录。
内容的提问来源于stack exchange,提问作者Tyler Rice
相关产品推荐
相关产品推荐

