我有一个任务是从.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);
答案 0 :(得分:0)
据我了解,matrix
的类型为int*
,您打算将从文件中读取的size*size
元素存储到其中。首先,您应该为size*size
大小int
分配内存,这可以按照以下方式完成。
matrix = malloc(size * size * sizeof(int));
接下来,当您通过i
和j
遍历从文件中读取的矩阵条目时,您需要进行正确的地址计算。由于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
个整数。