【问题标题】:Reading from file into 2d Array in C without constant size从文件读取到 C 中的二维数组没有固定大小
【发布时间】:2020-06-01 12:22:06
【问题描述】:

我有一个包含这样内容的文本文件

5 6
01111
11110
01000
01111
11010
11111

我想从这个文件中读取一个函数并从内容中创建一个二维数组。

第一行的两个数字是数组的大小和子数组的大小。

函数的结果应该是这样的数组

{{0,1,1,1,1}, {1,1,1,1,0},{0,1,0,0,0},{0,1,1,1,1},{1,1,0,1,0},{1,1,1,1,1}}

那我该怎么做呢?

现在我尝试做一个这样的函数但是它出错了

int** createArray(FILE *fp)
{
    int xdim;
    int ydim;
    fscanf(fp, "%d %d", &xdim, &ydim);

    int** arr = malloc(ydim * sizeof(*arr));;
    for (int y = 0; y < ydim; y++)
    {
        arr[y] = malloc(xdim * sizeof(**arr));
        fscanf(fp, "%d %d %d %d", arr[y]);
    }
    return arr;
}

【问题讨论】:

标签: c arrays file


【解决方案1】:

只需循环xdimarr[y] 然后用fscanf 读取数字。请注意,fscanf 格式说明符中的空格 " " 会忽略所有空格 - 制表符、空格和换行符 - 因此它可以全部读取。

int** arr = malloc(ydim * sizeof(*arr));;
if (arr == NULL) {
     abort();
}

for (int y = 0; y < ydim; y++) {

    arr[y] = malloc(xdim * sizeof(*arr[y]));
    if (arr[y] == NULL) {
        abort();
    }

    for (int i = 0; i < xdim; ++i) {
        char c;
        if (fscanf(fp, " %c", &c) != 1) {
            abort(); // handle error
        }
        arr[i][j] = c - '0';
    }
}

Tested on godbolt.

【讨论】:

  • 我只是试试这个,它在 if (fscanf(fp, "%d", &arr[y][i]) != 1) 条件下不断命中第三个 abort()。
  • 正确,因为11111 是一个整数。然后一次读取一个字符。
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 2017-08-23
  • 2016-01-05
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多