打开文件时出现分段错误
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.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
(除了其他答案:)这部分代码,
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 个文件,每个文件都包含 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.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
(除了其他答案:)这部分代码,
for (k=0;k<3;k++){
fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
}
尝试从 fa
读取六次。大概您打算从第二行的 fb
读取。