在C 中编写二进制INT数组时,然后在MATLAB中读取
Discrepancy when writing binary int array in C++, then reading in MATLAB
我正在使用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。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 在CMD中运行MATLAB代码,然后等待完成
- 将稀疏数组从 matlab 传递到 Eigen (C++),然后再传递回 matlab
- 在C 中编写二进制INT数组时,然后在MATLAB中读取
- 将来自 C++ 代码的向量写入文件,然后在 MATLAB 中读取它
- 将 Matlab 中的矩阵保存到 bin 文件中,然后用 c++ 读取