Читать элемент файла мудро - PullRequest
1 голос
/ 17 апреля 2011

Я хочу прочитать текстовый файл, содержащий данные матрицы 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 массиве

Ответы [ 3 ]

2 голосов
/ 18 апреля 2011

Сохранить количество строк и столбцов.Измените внутреннюю часть цикла 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++;
             }

         }

      }

Что касаетсяНа ум приходит strtok() - или вы можете использовать функции is*, объявленные в <ctype.h>.

Если вы абсолютно доверяете вводу, sscanf() также является хорошим вариантом.

1 голос
/ 18 апреля 2011

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 голос
/ 18 апреля 2011

Вы можете использовать функцию 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 (прочитано ли ожидаемое количество элементов?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...