因此,我正在尝试打开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;}
答案 0 :(得分:2)
使用./a.out a.txt+b.txt
,您将传递两个参数(即可执行文件名称./a.out
和a.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
中读取内容。