gpt4 book ai didi

c++ - 在 C++ 中写入二进制 int 数组,然后在 MATLAB 中读取时出现差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:34 26 4
gpt4 key购买 nike

我正在使用 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 的数组(这是有道理的,因为我正在阅读较小的 block )。如果我选择“int64”,我会以正确的维度结束,但值是错误的。

你对此有什么解释吗?

最佳答案

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

这应该是:

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

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

关于c++ - 在 C++ 中写入二进制 int 数组,然后在 MATLAB 中读取时出现差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com