【问题标题】:How to store integer values from a file into a 2D array using Malloc function如何使用 Malloc 函数将文件中的整数值存储到二维数组中
【发布时间】:2023-04-05 04:55:01
【问题描述】:
#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 创建一个二维数组,但现在我想从文件中获取信息并将其存储到我的二维数组中。

文件:

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”以下的数字存储到二维数组中。我怎么能这样。抱歉,如果我没有很好地解释这一点,我是编码新手。

【问题讨论】:

  • 旁注: 很遗憾你删除了你后来的问题stackoverflow.com/questions/69936656/…,因为我已经修复了它,并且在你删除它时发布了它。希望你发现你的错误
  • 该死的。我的作业是在 11:30 交的,我打算照原样交上来。我可以重新发布问题。
  • 您也可以取消删除问题,这样会更快。
  • 好的,我想它已经备份了!

标签: arrays c file pointers


【解决方案1】:

...将“4”以下的数字存储到二维数组中。

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

考虑也添加错误检查。

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

我能够使用 malloc 制作一个二维数组

代码没有分配二维数组。只是一个一维数组。
二维数组需要做更多的工作。

【讨论】:

    【解决方案2】:

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

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

    实际上,您并没有在代码中使用二维数组,而是使用一维数组来模拟它。要创建真正的动态二维数组,您应该使用指向可变长度数组 (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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多