将二进制文件 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);
}
只是一个快速评论开始:虽然有与此类似的线程,但我还没有完全找到我正在寻找的解决方案。我的问题如下: 我将二维数组保存到二进制文件中,我想将二进制文件(使用 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);
}