【问题标题】:Segmentation fault when opening files打开文件时出现分段错误
【发布时间】:2019-05-11 19:54:11
【问题描述】:

所以,我试图打开 2 个文件,每个文件都有 3 行和 2 个数字。编译后,我在终端中运行它(我使用的是 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;}

【问题讨论】:

  • 你需要用空格分隔参数
  • 你想要a.out a.txt + b.txt
  • 检查argc 以避免尝试访问实际上不存在的参数。在每个使用命令行参数的程序中执行此操作。
  • ohhhhhhhh 好的,现在可以了,但它仍然出现故障并且不会从文件中读取一些行(那些是最后的循环)

标签: c file segmentation-fault coredump


【解决方案1】:

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

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

尝试从fa 读取六次。大概您的意思是从第二行中的fb 阅读。

【讨论】:

    【解决方案2】:

    使用./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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多