将二进制文件转换为动态分配的C数组

时间:2016-02-26 03:18:18

标签: c arrays dynamic-arrays

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

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

并且工作正常。 假设这种方法可以修复,我也有兴趣知道它是否可以扩展到读取双复数组的数组。

非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

你的fread声明不正确。认为sizeof获得动态分配数组的大小是一个常见的初学者错误。它没有。在这种情况下,它只返回double **的大小。您需要读入文件中的每个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)执行此操作,但这可能更清晰。

答案 1 :(得分:1)

因为您分别分配了每一行,所以无法一次读入整个数组。你需要逐行进行。

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