#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);
}