在C 中编写二进制INT数组时,然后在MATLAB中读取

Discrepancy when writing binary int array in C++, then reading in MATLAB

本文关键字:然后 MATLAB 读取 INT 二进制 数组      更新时间:2023-10-16

我正在使用c 将int数组写成这样的二进制文件:

int * _row;
_row = new int[200];
// .. fill array
// outputs 8, so one integer should be 8 bytes long
cout << sizeof _row << endl;
ofstream fHandle;
fHandle.open("~/row.bin", ios::out | ios::trunc | ios::binary);
for (int ii=0;ii<200;ii++) {
  fHandle.write( (char*)&_row[ii], sizeof _row );
}
fHandle.close();

现在,当我在MATLAB(如下)中阅读它时,我没有原始数组。

fid = fopen("~/row.bin");
x = fread(fid, 'int32');
fclose(fid)

我意识到我应该使用由8位组成的数据类型(例如'int64'),但是使用'int32'我至少获得正确的值。但是,,每个值读取两次!我对此没有任何解释。我最终得到了400尺寸的数组(这是有道理的,因为我正在阅读较小的块)。如果我选择" int64",我以正确的维度结尾,但是值是错误的。

您对此有任何解释吗?

fHandle.write( (char*)&_row[ii], sizeof _row );

这应该是:

fHandle.write( (char*)&_row[ii], sizeof(int));

既然您想在循环的每个迭代中写一个整数,对吗?由于sizeof在编译时间进行评估,sizeof row仅返回指针(int*)的大小,该大小为64位系统(和64位编译)上的8个字节。sizeof row仅在行是静态数组(以int row[200];的形式)时返回数组的(字节 - )大小。由于所有这些都有点棘手,因此我在Codepad上写了一个小例子:http://codepad.org/fdpfo62y,它使用32位,因此指针的大小仅为4个字节。我使用了int16_t(大小为2个字节)来显示指针和数据类型大小之间的差异。

您也可以在没有for循环的情况下完成整个写作:

fHandle.open("~/row.bin", ios::out | ios::trunc | ios::binary);
fHandle.write((char*)_row, sizeof(int)*200);
fHandle.close();

另外,如果您在MATLAB中使用明确的数据类型大小,我建议您也会在C 中使用它们,因此使用C 11,可以使用int32_t代替INT。