我正在尝试访问文件并将数据fscanf为2d数组,但每当我运行代码时,我都会遇到Segmentation fault(核心转储)。我试图寻找解释为什么,但似乎无法找到一个。我知道我试图打开的文件位于正确的位置并且拼写错误。有什么帮助吗?
#include <stdio.h>
#include <math.h>
#define FILENAME "rocket1.txt"
int main(void)
{
FILE *rocket1;
int i, NROWS, NCOLS, k, num_data_pts;
double x[NROWS][NCOLS];
rocket1 = fopen(FILENAME,"r");
if(rocket1 == NULL)
{printf("Error opening file.\n");}
fscanf(rocket1,"%d",&num_data_pts);
for(i=1;i<=num_data_pts;i++)
for(k=0;k<4;k++)
fscanf(rocket1,"%lf",&x[i][k]);
fclose(rocket1);
return 0;
}
答案 0 :(得分:1)
要修复您的程序,请尝试以下操作:
#include <stdio.h>
#include <math.h>
#define FILENAME "rocket1.txt"
#define NROWS 10
#define NCOLS 10
int main(void)
{
FILE *rocket1 = NULL;
int i, k, num_data_pts;
double x[NROWS][NCOLS];
rocket1 = fopen(FILENAME, "r");
if (rocket1 == NULL)
{
printf("Error opening file.\n");
}
else
{
fscanf(rocket1, "%d", &num_data_pts);
if ( NROWS <= num_data_pts || NCOLS < 4 )
{
printf("Post Fence Error. Increase Array Size.\n");
}
else
{
for (i = 1; i <= num_data_pts; i++)
for (k = 0; k < 4; k++)
fscanf(rocket1, "%lf", &x[i][k]);
fclose(rocket1);
}
}
return 0;
}
这里为了演示目的,NROWS和NCOLS被视为10。 在您的代码中,您从索引1(非0)访问i和i的x [i] [k] 扩展到num_data_pts(包括)。因此,包括额外的检查 防止在数组大小之外访问。
答案 1 :(得分:0)
这里有两个主要问题:
您正在声明NROWS和NCOLS,但没有初始化它们。
int NROWS, NCOLS;
简单地为2个整数分配内存。他们的初始价值怎么样?您需要分配合适的值,否则它们可能包含垃圾数据。 类似的东西:
int NROWS = 10, NCOLS = 10;
是可取的。
您正在尝试打开文件“rocket1.txt”。这段代码有问题:
rocket1 = fopen(FILENAME,"r");
if(rocket1 == NULL)
{printf("Error opening file.\n");}
如果rocket1为NULL,那么你确实打印了一个错误,但是你通常应该终止该程序。
rocket1 = fopen(FILENAME,"r");
if(rocket1 == NULL) {
printf("Error opening file.\n");
exit(1);
}
退出程序很重要,因为如果rocket1 = NULL,那么对rocket1的任何后续引用都可能导致NULL指针deference,这将导致段错误。
希望这有帮助!