【问题标题】:Discrepancy when writing binary int array in C++, then reading in MATLAB在 C++ 中写入二进制 int 数组,然后在 MATLAB 中读取时的差异
【发布时间】:2014-02-12 10:44:44
【问题描述】:

我正在使用 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”,我会以正确的维度结束,但值是错误的。

你对此有什么解释吗?

【问题讨论】:

    标签: c++ matlab int binaryfiles


    【解决方案1】:
    fHandle.write( (char*)&_row[ii], sizeof _row );
    

    这应该是:

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

    既然您想在 for 循环的每次迭代中写入一个整数,对吗? 由于sizeof 是在编译时评估的,sizeof row 只返回一个指针 (int*) 的大小,在 64 位系统(和 64 位编译)上是 8 个字节。 sizeof row 只会在 row 是静态数组(格式为 int row[200];)时返回数组的(字节)大小。由于所有这些解释起来有点棘手,我在键盘上写了一个小例子: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。

    【讨论】:

    • 非常感谢,完美运行!只是出于兴趣,你能解释一下为什么sizeof _row 会产生 8 吗?
    • 感谢您花时间解释,这很有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多