快速评论一下:虽然有一个与此类似的线索,但我还没能找到我正在寻找的解决方案。我的问题如下: 我将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;
并且工作正常。 假设这种方法可以修复,我也有兴趣知道它是否可以扩展到读取双复数组的数组。
非常感谢任何建议!
答案 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);
}