[英]read/write a complex struct into the binary file
我有以下结构
typedef struct a_t
{
vector <int> a;
int p;
}a;
typedef struct b_t
{
a x;
int y;
}b;
struct a是包含向量的struct,struct b包含结构a,我想将struct b写入/读取到二进制文件中。 以下代码不起作用
int main()
{
b m;
m.x.a.push_back(1);
m.x.a.push_back(2);
m.x.a.push_back(3);
m.x.p = 5;
m.y = 7;
cout << sizeof(m.y) << endl;
cout << sizeof(m.x) << endl;
cout << sizeof(m) << endl;
ofstream outfile("model",ios::out|ios::binary);
outfile.write((char*)&m,sizeof(m));
outfile.close();
b p;
ifstream iffile("model", ios::in|ios::binary);
iffile.read((char*)&p,sizeof(a));
iffile.close();
cout << p.y << endl;;
cout << p.x.p << endl;
cout << p.x.a[0] << endl;
cout << p.x.a[1] << endl;
cout << p.x.a[2] << endl;
return 0;
}
错误消息是“ *检测到glibc 双重释放或损坏(顶部):0x0000000000504010 * *中止(内核已转储)“,它不会将结构写入文件。
您无法写入和读取向量,因为它们在堆上分配数据。 如果您的应用程序有实际限制,则可以决定使用普通的C数组更好(为了提高速度和清晰度,可能会牺牲存储空间):
#define MAXARR_A 100
typedef struct a_t
{
int a[MAXARR_A];
int p;
} a;
否则,您必须通过写出大小然后转储数组数据来序列化向量。 要读回它,请先读取大小,然后调整向量的大小并读取其中的字节。
编辑 :决定为您添加一些代码...它可能会编译! =)
void write_a( a& data, ostream& s )
{
size_t len = data.a.size();
s.write( (char*)&len, sizeof(len) );
s.write( (char*)&data.a[0], len * sizeof(int) );
s.write( (char*)&data.p, sizeof(int) );
}
void write_b( b& data, ostream& s )
{
write_a( data.x, s );
s.write( (char*)&data.y, sizeof(int) );
}
void read_a( a& data, istream& s )
{
size_t len;
s.read( (char*)&len, sizeof(len) );
data.a.resize(len);
s.read( (char*)&data.a[0], len * sizeof(int) );
s.read( (char*)&data.p, sizeof(int) );
}
void read_b( b& data, istream& s )
{
read_a( data.x, s );
s.read( (char*)&data.y, sizeof(int) );
}
请注意,我没有包含任何错误检查...。此外,将这些函数作为结构上的read
和write
成员函数将更像C ++。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.