2017-04-12 104 views
0

我试图访问一个文件和fscanf数据到一个二维数组,但每当我运行代码时,我得到分段错误(核心转储)。我试图寻找一个解释,为什么,但似乎无法找到一个。我知道我试图打开的文件位于正确的位置,并且没有拼错。任何帮助?分割错误。为什么?

#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; 
} 
+2

首先,您没有定义NROWS或NCOLS - 因此您不知道阵列的尺寸。您需要了解如何使用GDB,以便您可以自行调试问题。 – ewindes

回答

0

这里有两个主要问题:

  1. 您声明NROWS和NCOLS而不是初始化它们。

    int NROWS, NCOLS; 
    

简单地进行2点的整数分配内存。他们的初始价值呢?您需要分配合适的值,否则可能会包含垃圾数据。 类似于:

int NROWS = 10, NCOLS = 10; 

是可取的。

  1. 您正在尝试打开文件“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指针顺从。

希望这会有所帮助!

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 在你的代码访问的X取[我]从指数1(不是0 [K] )for i和 扩展到num_data_pts(含)。所以,额外的检查包括 以防止访问超出数组大小。