C++矢量二进制I/O
C++ vector binary I/O
嗨:我试图在二进制模式下写入和读取2D矢量。但是,我没有得到正确的输出。我的C++代码如下。任何形式的帮助都将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <complex>
using namespace std;
int main()
{
typedef unsigned uint;
typedef complex<double> TYPE;
uint size=10;
uint datasize=size*size*sizeof(TYPE);
vector<vector<TYPE> > X(size, vector<TYPE> (size));
for(uint i = 0 ; i < X.size() ; ++i ){
for(uint j = 0 ; j < X.size() ; ++j ){
X[i][j]={(double)i, (double)j};}}
for(uint i = 0 ; i < X.size() ; ++i ){
for(uint j = 0 ; j < X.size() ; ++j ){
cout << X[i][j] << ' ';}
cout << std::endl;}
ofstream o("out.bin",ios_base::binary);
o.write( (char *)(&X[0][0]), datasize );
o.clear();
o.close();
cout<<"**************************************"<<std::endl;
vector<vector<TYPE> > Y(size, vector<TYPE> (size));
streampos begin, end;
ifstream in("out.bin",ios_base::binary);
in.read( (char *)(&Y[0][0]), datasize);
in.clear();
in.close();
for(uint i = 0 ; i < Y.size() ; ++i ){
for(uint j = 0 ; j < Y.size() ; ++j ){
cout << Y[i][j] << ' ';}
cout << std::endl;}
return 0;
}
输出
(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9)
(1,0) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9)
(2,0) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9)
(3,0) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9)
(4,0) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9)
(5,0) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9)
(6,0) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9)
(7,0) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9)
(8,0) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9)
(9,0) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8) (9,9)
**************************************
(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9)
(1,0) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9)
(2,0) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9)
(3,0) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9)
(4,0) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9)
(5,0) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9)
(6,0) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9)
(7,0) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9)
(8,0) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9)
(9,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0)
令人惊讶的是,它能如此出色地工作——子向量的内存分配方式很幸运。
代替
o.write( (char *)(&X[0][0]), datasize );
和
in.read( (char *)(&Y[0][0]), datasize);
您需要在X和Y的子向量上循环,并分别写入/读取它们;例如
for (size_t i = 0; i < size; ++i) {
o.write( (char *)(&X[i][0]), size*sizeof(TYPE) );
}
和
for (size_t i = 0; i < size; ++i) {
o.read( (char *)(&Y[i][0]), size*sizeof(TYPE) );
}
只有子向量具有连续的内存。这些循环遍历每个"2-D数组"的子向量,并按顺序保存它们,然后按顺序读回它们。
o.write( (char *)(&X[0][0]), datasize );
这个演员阵容毫无意义。你必须实际组装你想写的字节——你不能只是假装它们已经在那里了。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 二进制数之和(使用C样式字符串)
- 如何从dicom文件中读取二进制数据
- 基于编译器选项的编译二进制路径