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

C语言fscanf触发段错误,提示lab4.dat缺失但文件实际在同目录

问题根因

  • 最核心的错误是文件打开后的判空逻辑使用了赋值运算符=而非比较运算符==:
    你写的if (infile = NULL)会直接将infile强制赋值为NULL,且该判断条件永远为假,哪怕文件实际打开失败也不会进入错误退出分支。后续fscanf读取NULL的文件指针直接触发段错误,也不会弹出你写的文件打开错误提示。
  • 次要问题:
    1. 预先定义了文件名宏IN_FILE_NAME、OUT_FILE_NAME,但实际fopen时没有使用,硬编码了文件名,存在代码维护风险
    2. 业务逻辑顺序错误:先把梯形计算结果写入输出文件,再打印表头,最终输出的txt文件中数据会出现在表头上方,不符合阅读习惯
    3. 写入每行计算结果时没有加换行符,会导致所有数据挤在同一行

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:45:04