因此,我试图打开两个文件,每个文件都有三行和两个数字。编译后,我在终端中运行它(我使用的是Ubuntu ftr(作为
./a.out a.txt+b.txt
它什么也不回。当我注释掉代码中的"检查它是否正确打开"部分时,它只会吐出一些数字,并打印出一个错误"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 %lfn", A[k], Ag[k]);
printf("%lf %lfn", B[k], Bg[k]);
}
fclose(fa);
fclose(fb);
return 0;}
(除了其他答案:(这部分代码,
for (k=0;k<3;k++){
fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
}
尝试从CCD_ 1读取六次。大概你是想读fb
的第二行。
使用./a.out a.txt+b.txt
,您将传递两个参数(即可执行文件名./a.out
和a.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