明智地阅读文件元素

时间:2011-04-17 19:47:08

标签: c linux file-io

我想读取包含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 个答案:

答案 0 :(得分: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++;
             }

         }

      }

至于&lt; FOR EVERY VALUE IN LINE&gt;我会想到strtok() - 或者您可以使用is*中声明的<ctype.h>函数。

如果您完全信任输入,sscanf()也是一个不错的选择。

答案 1 :(得分: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 :(得分: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]);
}

当然,您需要使代码更通用