2011-04-17 112 views
1

我想讀取包含4X4矩陣的數據的文本文件每個元素是由一個空格分隔,它被分成4行代表矩陣。它是繼形式閱讀文件元素明智

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

現在我遇到了代碼

static const char filename[] = "file.txt"; 
    FILE *file = fopen (filename, "r"); 
    if (file != NULL) 
    { 
     char line [ 128 ]; /* or other suitable maximum line size */ 

     while (fgets (line, sizeof line, file) != NULL) /* read a line */ 
     { 
     fputs (line, stdout); /* write the line */ 
     } 
     fclose (file); 
    } 
    else 
    { 
     perror (filename); /* why didn't the file open? */ 
    } 
    return 0; 

讀取該文件,但我想知道,怎樣閱讀元素方式,這樣我就可以將它們存儲在2D array

回答

1

的fscanf救援:

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

int main() 
{ 
    FILE* file = fopen("input.txt", "r"); 
    if (!file) 
     perror("Can't open input"); 

    int matrix[4][4] = { 
     { 0, 0, 0, 0, }, 
     { 0, 0, 0, 0, }, 
     { 0, 0, 0, 0, }, 
     { 0, 0, 0, 0, }, 
    }; 

    int i; 
    for (i=0; i<4; i++) 
    { 
     int n = fscanf(file, "%i %i %i %i", &matrix[i][0], 
       &matrix[i][1], 
       &matrix[i][2], 
       &matrix[i][3]); 
     if (n != 4) { 
      if (errno != 0) 
       perror("scanf"); 
      else 
       fprintf(stderr, "No matching characters\n"); 
     } 
    } 

    for (i=0; i<4; i++) 
     printf("%i %i %i %i\n", matrix[i][0], 
       matrix[i][1], 
       matrix[i][2], 
       matrix[i][3]); 
} 

當然,你需要使代碼更通用

1

您可以使用fscanf函數。

#include <stdio.h> 

int main() 
{ 
    FILE* file; 

    int array[4][4]; 

    int y; 
    int x; 

    file = fopen("matrix.txt","r"); 
    for(y = 0; y < 4; y++) { 
    for(x = 0; x < 4; x++) { 
     fscanf(file, "%d", &(array[x][y])); 
    } 
    fscanf(file, "\n"); 
    } 
    fclose (file); 
    for(y = 0; y < 4; y++) { 
    for(x = 0; x < 4; x++) { 
     printf("%d ", array[x][y]); 
    } 
    printf("\n"); 
    } 
    return 0; 
} 

注:在生產代碼,您應檢查fopen返回值(這可能是NULL),以及fscanf返回值(這樣做是讀元素的預期量?)。

2

保持行和列數。更改while循環

 line = 0; 
     column = 0; 
     while (fgets (line, sizeof line, file) != NULL) /* read a line */ 
     { 
     // fputs (line, stdout); /* write the line */ 

     <FOR EVERY VALUE IN LINE> 
     { 

      matrix[line][column] = <VALUE>; 
      column++; 
      if (column == 4) { 
       column = 0; 
       line++; 
      } 

     } 

     } 

對於< FOR每個值IN LINE > strtok()想到的內部 - 或者你可以使用<ctype.h>宣佈is*功能。

如果你絕對相信輸入,sscanf()也是一個不錯的選擇。