将二进制文件 fread 到动态分配的 C 数组中

fread'ing a binary file into a dynamically allocated C array

只是一个快速评论开始:虽然有与此类似的线程,但我还没有完全找到我正在寻找的解决方案。我的问题如下: 我将二维数组保存到二进制文件中,我想将二进制文件(使用 C 代码)读入二维数组。此外,我需要动态分配内存,因为数组的形状会在我的应用程序中发生变化。首先,我尝试了以下代码:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(){

int N = 10; //number of rows of 2D array
int M = 20; //number of columns

/* first allocate the array */

double **data;

data = (double **)malloc(N*sizeof(double *));

for(unsigned int i=0; i < N; i++) {

    data[i] = (double *)malloc(sizeof(double)*M);

    }


FILE *ptr;
ptr = fopen("random_real_matrix.dat", "rb");

fread(data, sizeof(data), 1, ptr);

for(unsigned int i=0; i<10;i++){


    for(unsigned int j=0; j<20;j++){
            fprintf(stderr, "m[%d][%d] = %f\n ", i, j, data[i][j]);

            }
     }

}

不幸的是,这段代码有段错误。我检查了是否可以将数组条目设置为

d[0][0] = 235;

而且效果很好。 假设可以修复此方法,我也很想知道是否可以将其扩展为读取双复数数组。

如有任何建议,我们将不胜感激!

您的 fread 语句不正确。认为 sizeof 获取动态分配数组的大小是初学者常见的错误。它没有。在这种情况下,它只是 returns 个 double ** 的大小。您需要读取文件中的每个双精度值并将其放入数组中的正确位置。

for (int ii = 0; ii < N; ++ii)
{
   for (int jj = 0; jj < M; ++jj)
   {
     fread(data[ii][jj], sizeof(double), 1, ptr);
     // Be sure to check status of fread
   }
}

您可以使用单个 for 循环(或单个 fread)执行此操作,但这可能更易读。

因为你分别分配了每一行,你不能一次读入整个数组。你需要一行一行地做。

for (int i = 0; i < N; i++) {
    fread(data[i], sizeof(double), M, ptr);
}