将矩阵从.txt复制到数组中

时间:2016-10-24 19:14:12

标签: c arrays matrix

我有一个任务是从.txt文件中读取矩阵,然后在C中创建一个2D数组。我很好地读取数字,但是我将这些数字写入数组时遇到问题,因为我需要分配内存,因为我不知道有多大矩阵将是。

int read()
{

   FILE *f;
   int number, i, j, size;

   f = fopen("matrix.txt","r");
   if (f == NULL)
   {
      printf("Error reading matrix.txt\n");
      return 1;
   }

   printf("Sucess! \n");
   fscanf(f, "%d",&size);
   printf("Size of matrix: %d\n", size,size);

   int* matrix;

   matrix = malloc(size * sizeof(int));

   for(; feof(f) == 0;)
   {
        for(i = 0; i < size; i++)
        {
            for(j = 0; j < size; j++)
            {
              fscanf(f,"%i",&number);
//          *(*(matrix+j)+i) = number; 
              printf("%i\t",number);
            }
        printf("\n");
        }
   }
   fclose(f);

2 个答案:

答案 0 :(得分:0)

据我了解,matrix的类型为int*,您打算将从文件中读取的size*size元素存储到其中。首先,您应该为size*size大小int分配内存,这可以按照以下方式完成。

matrix = malloc(size * size * sizeof(int));

接下来,当您通过ij遍历从文件中读取的矩阵条目时,您需要进行正确的地址计算。由于matrix的类型为int*,因此可以按照以下方式完成。

matrix[ i * ( size - 1 ) + j ] = number;

话虽这么说,也许最好是matrix类型为int**,并手动为行分配空间。通过这样做,您可以通过

访问元素
matrix[ i ][ j ] = number;

这可能更直观。

答案 1 :(得分:0)

你可以这样做:

matrix[(size-1)*i+j]=number

要填充数组,这是在C中模拟2D数组的常用方法,要了解(size-1)*i+j来自此示例的注意事项:

1 2 3
4 5 6
7 8 9

结果数组是:1 2 3 4 5 6 7 8 9

因此,当我们从第一行和第一列开始时,在结果数组中,1是第一个元素,因此其索引为零。

当我们前进一行(从1到4)时,我们在结果数组中前进三个位置,因此索引为3.

现在,如果我们从第1列(第二列)开始,第一行我们有2在结果数组中有索引1,如果我们前进一行(从2到5),我们也前进3个位置,索引是4.

请注意,3实际上是矩阵的大小,我认为您可以验证i*(size-1)+j是否有效,size-1是这样的,因为C数组是从零开始的。

注意

如果你的文件只有一个矩阵,我建议你摆脱最外面的循环,一个简单的错误(比如矩阵或空格后的新行)会导致调用fscanf(f,"%i",&number)而不会找到一个数字(我不确定接下来会发生什么)。

此外,您应该分配size*size个整数。