2015-02-15 2 views
0

Предположим, у вас есть файл с именем «input.txt», который выглядел так:Чтение сетки из текстового файла и сохранение ее в двухмерном массиве?

5 
0 0 0 0 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 0 0 
0 0 0 0 0 

5 х 5 сетки выше. И вы хотели сохранить сетку 5 x 5 в двумерный массив C. Моя проблема - чтение файла в эту сетку.

Это мой C-файл, который считывает данные, сохраняет их в 2D целого массива и выводит его содержимое

int main (int argc){ 

    FILE *fp; 
    char ch; 
    int **C; //Our 2D Array 
    char filenamein[] = "input.txt"; 

    fp = fopen(filenamein,"r"); 

    N = (ch = fgetc(fp)) - 48; 

    //Initialize Grid, set all cells to 0 
    C = malloc(N * sizeof(int *)); 
     for (i = 0; i < N; i++) { 
      C[i] = malloc(N * sizeof(int)); 
     } 
    for (i=0;i<N;i++) { 
    for (j=0;j<N;j++) { 
     C[i][j]=0; 
    } 
    } 

    //Read array, store into array 
    while ((ch = fgetc(fp)) != EOF) 
    { 
    for (i=0;i<N;i++){ 
     for (j=0;j<N;j++){ 
     C[i][j] = ch - 48; 
     } 
    } 
    } 

    //Print 2D Array: 

    for (i = 0; i < N; i++) { 
      for (j = 0; j < N; j++) 
       printf("%d ", C[i][j]); 
      printf("\n"); 
      } 

fclose(fp); 
} 

После вызова этого я получаю:

-38 -38 -38 -38 -38 
-38 -38 -38 -38 -38 
-38 -38 -38 -38 -38 
-38 -38 -38 -38 -38 
-38 -38 -38 -38 -38 

Сетка выводит char-to-decimal ASCII-код для Whitespace/NULL из того, что я вычитал, поэтому моя проблема читается в текстовом файле в массиве.

Как я могу прочитать текстовый файл для хранения чисел в массиве?

+2

Почему вы используете 'fgetc' вместо' fscanf'? когда вы используете fgetc, вы читаете символ пробела, поэтому вам нужно игнорировать их в части построения сетки. –

+0

Существует очень мало того, что можно получить, называя fgetc() 'и преобразовывая значения ASCII в числа. Диск-доступ является узким местом здесь, а не преобразованием символов. Просто используйте 'scanf()' для ввода данных в виде десятичных чисел. (Кроме того, 'fgetc()' возвращает целое число, поэтому 'while ((ch = fgetc (fp))! = EOF)' может катастрофически потерпеть неудачу). –

+0

Также есть ошибка в вашей инициирующей сетке части, вы каждый раз заполняйте всю свою сетку новым символом чтения. –

ответ

1

Этот код работает должным образом. лучше использовать fscanf вместо fgetc, но я не исправил это в вашем коде.

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

int main (int argc, char *argv[]) 
{ 
    FILE *fp; 
    unsigned char ch; 
    int **C; //Our 2D Array 
    int N, i, j; 
    char filenamein[] = "input.txt"; 

    fp = fopen(filenamein,"r"); 

    N = (ch = fgetc(fp)) - 48; 

    //Initialize Grid, set all cells to 0 
    C = malloc(N * sizeof(int *)); 
    for (i = 0; i < N; i++) 
     C[i] = malloc(N * sizeof(int)); 

    for (i = 0; i < N; i++) 
     for (j = 0; j < N; j++) 
      C[i][j] = 0; 

    i = 0; 
    j = 0; 
    do { 
     ch = fgetc(fp); 
     if (ch != ' ' && ch != '\n') { 
      C[i][j] = ch - 48; 
      j++; 
      i += j/N; 
      j %= N; 
     } 
    } while(i < N && j < N); 

    //Print 2D Array: 
    for (i = 0; i < N; i++) { 
     for (j = 0; j < N; j++) 
      printf("%d ", C[i][j]); 
     printf("\n"); 
    } 
    fclose(fp); 
} 
Смежные вопросы