打开文件时出现分段错误

时间:2018-12-10 21:13:45

标签: c file segmentation-fault coredump

因此,我正在尝试打开2个文件,每个文件有3行和2个数字。编译后,以

的形式在Terminal(我正在使用Ubuntu ftr)中运行它
./a.out a.txt+b.txt

它什么也不返回。当我注释掉代码的“检查是否正确打开”部分时,它只会吐出一些数字并打印出错误“分段错误(核心已转储)”。我真的不知道我在做什么错,因为这段代码对我的朋友来说运行得很好。我在下面提供了令人讨厌的代码。 (本代码的其余部分应该对数字进行运算,因此这就是文件名之间加号的原因。)

#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;}

2 个答案:

答案 0 :(得分:2)

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

在访问argc之前始终检查argv,并继续检查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

答案 1 :(得分:2)

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

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

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