2017-04-12 109 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(含)。所以,額外的檢查包括 以防止訪問超出數組大小。