2015-02-17 85 views
0

我希望根據文件中的值創建二維數組。我可以通過使用下列代碼在本地數組來做到這一點:C - 基於文件初始化全局二維數組

int main() 
{ 
    int a = 5; //this is from a file 
    int b = 6; //this is from a file 
    int (*array2d)[a] = malloc(sizeof(int)*a*b); 

    return 0; 
} 

但是,我想array2d是全局的。以下不起作用:

int **array2d 

int main() 
{ 
    int a = 5; //this is from a file 
    int b = 6; //this is from a file 
    (*array2d)[a] = malloc(sizeof(int)*a*b); 

    return 0; 
} 

有沒有簡單的方法可以做到這一點?

+0

是您的文件文本文件?這個文件的格式是什麼? – VolAnd 2015-02-17 21:35:08

+0

[用malloc定義二維數組並修改它]的可能重複(http://stackoverflow.com/questions/3584705/defining-a-2d-array-with-malloc-and-modifying-it) – 2015-02-17 21:35:45

+0

「** array2d」後面缺少分號。它編譯(帶有警告),如果你把分號。 – shooper 2015-02-17 21:40:56

回答

1

分配和內存二維陣列去分配你可以用函數執行:

#include <stdlib.h> 
#include <stdio.h> 

int ** allocIntArray(int nrows, int ncols) 
// allocate memory for 2D array and returns pointer if successful or NULL if failed 
{ 
    int r, c; // rows and cols counters 
    int ** parray; // pointer to array 
    // allocate memory for rows pointers 
    parray = (int **) malloc(nrows * sizeof(int *)); 
    if(parray == NULL) // check 
    { 
     return NULL; // error sign 
    } 
    // allocate memory for each row 
    for (r = 0; r < nrows; r++) 
    { 
     parray[r] = (int*) malloc(ncols * sizeof(int)); 
     if(parray[r] == NULL) // check 
     { 
      // clean memory that was allocated before error 
      while(--r >= 0) 
      { 
       free(parray[r]); 
      } 
      free(parray); 
      return NULL; // error sign 
     } 
    } 
    // return when success 
    return parray; 
} 

int freeIntArray(int nrows, int **parray) 
// frees memory allocated for 2D array and returns 1 if successful or 0 if failed 
{ 
    int r; // rows counter 
    if(parray == NULL || nrows < 1) 
    { 
     return 0; 
    } 
    // free memory allocated for each row 
    for (r = 0; r < nrows; r++) 
    { 
     if(parray[r] != NULL) 
     { 
      free(parray[r]); 
     } 
    } 
    // free memory allocated for rows pointers 
    free(parray); 
    return 1; 
} 

有了這兩種功能,您可以創建任意大小的數組,例如:

int ** globArr; 
int nrows; // number of rows 
int ncols; // number of columns 

int main(int argc, char * argv[]) 
{ 
    // let's filename is in argv[1] 
    if(argc < 2) // we have not filename 
    { 
     printf("File name must be given as command line argument!\n"); 
     return 1; // exit from program 
    } 
    // when we have filename try to use it 
    FILE * f = fopen(argv[1], "r"); 

    if(f == NULL) // we cannot read from file 
    { 
     printf("File %s cannot be read!\n", argv[1]); 
     return 2; // exit from program 
    } 
    // when we have file openned for reading 
    // we try to read first two numbers and use them as size of array 
    if(2 != fscanf(f, "%d %d", &nrows, &ncols)) // we cannot read two numbers 
    { 
     printf("ERROR: Wrong file format!\n"); 
     return 3; // exit 
    } 
    // check that numbers are positive 
    if(nrows < 1 || ncols < 1) 
    { 
     printf("ERROR: Wrong data size!\n"); 
     return 4; // exit 
    } 
    // now we can allocate memory 
    globArr = allocIntArray(nrows, ncols); 
    // check that array allocated 
    if(globArr == NULL) 
    { 
     printf("ERROR: Cannot allocate memory!\n"); 
     return 5; // exit 
    } 
    // and start a loop to read data from file 
    int r, c; 
    for(r = 0; r < nrows; r++) 
    { 
     for(c = 0; c < ncols; c++) 
     { 
      if (feof(f)) // end of file reached 
      { 
       printf("ERROR: Unexpected end of file!\n"); 
       return 6; // exit 
      } 
      if(1 != fscanf(f, "%d", &globArr[r][c])) 
      { 
       printf("ERROR: Wrong file format!\n"); 
       return 6; // exit 
      } 
     } 
    } 
    fclose(f); 
    // Now work with data 
    // . . . 

    return freeIntArray(nrows, globArr); 
} 

注意:文件格式可以不同於我的。我希望,該計劃將在格式

2 3 
10 20 30 
40 50 60 

讀取文件
2 3 10 20 30 40 50 60 

2 
3 
10 
20 
30 
40 
50 
60 

,其中2和3定義二維數組的大小