c-如何使用Malloc函数将文件中的整数值存储到2D数组中


#include <stdio.h>
#include <stdlib.h>
int main() {
int row = 0, colu = 3, j, i;
FILE *fp;
fp = fopen("file.txt", "r");
fscanf(fp, "%d", &row);
int *arr = (int *)malloc(row * colu * sizeof(int));

for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
*(arr + i * col + j) = i + j;
printf("%d ", *(arr + i * col + j));
}
printf("n");
}
}

所以我可以使用malloc制作一个2D阵列,但现在我想从文件中获取信息并将其存储到我的2D阵列中。

文件:

4
34.1  54.2  54
23.4  19.5  53.2
43.2  54.2  54.2 
53.2  62.4  27.5

等等……

第一行是我要使用的行数。我已经想好了怎么做。但现在我想把数字存储在";4〃;转换成2D阵列。我怎么能这么做。如果我没有很好地解释这一点,我很抱歉,我是编码新手。

。。。以存储下面的数字";4〃;转换成2D阵列。

添加一个fscanf()以存储到arr指向的1D数组中。

也可以考虑添加错误检查。

if (fscanf(fp, "%d ", arr + i * col + j) != 1) {
fprintf(stderr, "Failed to read.n");
exit(-1);
}
printf("%d ", *(arr + i * col + j));

我能够使用malloc 制作2D阵列

代码未分配2D数组。只是一个1D阵列
2D阵列需要更多的工作。

函数fscanf获取写入扫描数据的对象的地址。它返回许多成功扫描的元素,而在您的情况下,这些元素将是1。这就是为什么scanf类函数的典型用法如下。

int data;
if (scanf("%d", &data) != 1)
... error handling ...
... use data ...

实际上,您在代码中不使用2D数组,而是使用1D数组来模拟它。要创建真正的动态2D数组,您应该使用指向可变长度数组(VLA(的指针。下面您可以找到一个经过错误处理的更新版本,强烈建议在处理文件时使用该版本。

#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 0, cols = 3, j, i;
FILE *fp;
fp = fopen("file.txt", "r");
if (!fp) {
fprintf(stderr, "failed to open file.txt");
exit(-1);
}
if (fscanf(fp, "%d", &rows) != 1) {
fprintf(stderr, "failed to read number of rows");
exit(-1);
}
// allocate memory for `row` elements of type `*arr` which is `int[cols]`
int (*arr)[cols] = calloc(rows, sizeof *arr);
if (!arr) {
fprintf(stderr, "out of memory");
exit(-1);
}

for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (fscanf(fp, "%d", &arr[i][j]) != 1) {
fprintf(stderr, "failed to parse entry at [%d,%d]", i, j);
exit(-1);
}
}}
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
printf("%d ", arr[i][j]);
puts(""); // newline
}
free(arr);
}

最新更新