C fscanf 给出分段错误。说缺少文件(我的文件名为 lab4.dat 并且位于同一位置)

C fscanf giving Segmentation Fault. Says missing file (my file is named lab4.dat and is in the same location)

它在我的 While 循环中的 fscanf 处出现段错误。说文件不存在,但它确实存在,里面有数据,并且与 .c 文件位于同一位置。非常感谢任何帮助!

#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("lab4.dat" , "r");
    if (infile = NULL){
        printf("Error on fopen input file\n");
        exit (EXIT_FAILURE);
    }

    outfile = fopen("lab4.txt", "w");
    if (outfile = NULL){
        printf("Error on fopen output file\n");
        exit (EXIT_FAILURE);
    }


    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", h, s1, s2, area);
    }

    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");
    fprintf(outfile, "\n\n");

    fclose(infile);
    fclose(outfile);

    return EXIT_SUCCESS;

/*---------------------------------------------------*/
}

在您的 if 条件中,您正在使用赋值运算符 = 来检查相等性。这是错误的。您应该使用 == 运算符来比较值。

当您达到 fscanf 时,您的 infile 已经为 NULL。

正如@babon 发布的那样,这里的答案是使用赋值 (=) 而不是相等测试 (==)。

问题是 if 中的赋值在 C 中是完全合法的代码,因此编译没有问题。评论中推荐的一种解决方案是在编译时打开警告。这是至关重要的。错误会阻止您的代码编译,但警告会提示 运行 时间错误等待发生。

除了注意warnings,你还可以在你的conditions中反推条款。

这样编译:

if (infile = NULL) {
}

编译:

if (NULL = infile) {
}

但是这样做:

if (NULL == infile) {
}