打开文件时出现分段错误

Segmentation fault when opening files

因此,我尝试打开 2 个文件,每个文件都包含 3 行和 2 个数字。编译后,我在终端中 运行 它(我正在使用 Ubuntu ftr)作为

./a.out a.txt+b.txt

它returns什么都没有。当我注释掉代码的 "check if it opens properly" 部分时,它只是吐出一些数字并打印出错误 "Segmentation fault (core dumped) "。我真的不知道我做错了什么,因为这段代码 运行 对我的朋友来说很好。我在下面提供了令人讨厌的代码。 (其余代码应该对数字进行 运行 操作,这就是文件名之间有一个加号的原因。)

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

int main(int argc, char** argv){
    FILE* fa = fopen(argv[1],"r"); if(!fa)exit(1);
    FILE* fb = fopen(argv[3],"r"); if(!fb)exit(1); 
    int k;
    double A[3];
    double Ag[3];
    double B[3];
    double Bg[3];

    for (k=0;k<3;k++){
        fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
        fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
    }
    for (k=0;k<3;k++){
        printf("%lf %lf\n", A[k], Ag[k]);
        printf("%lf %lf\n", B[k], Bg[k]);
    }
    fclose(fa);
    fclose(fb);

return 0;}

使用 ./a.out a.txt+b.txt,您传递了两个参数(即可执行文件名称 ./a.outa.txt+b.txt,而不是三个。因此,当您访问 FILE* fb = fopen(argv[3],... 时,您超出了argv 的边界并产生未定义的行为。

在访问 argv 之前始终检查 argc,并继续检查 NULL 值:

if (argc < 3) {
   printf("wrong number of arguments.");
   exit(1);
}
FILE* fa = fopen(argv[1],"r"); if(!fa)exit(1);
FILE* fb = fopen(argv[2],"r"); if(!fb)exit(1);

然后 - 传递两个文件名 - 将其命名为

./a.out a.txt b.txt

(除了其他答案:)这部分代码,

for (k=0;k<3;k++){
    fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
    fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
}

尝试从 fa 读取六次。大概您打算从第二行的 fb 读取。