c++ - 将复杂结构读/写到二进制文件中

标签 c++ file-io vector struct

我有以下结构

typedef struct a_t
{
    vector <int> a;
    int p;
}a;

typedef struct b_t
{
    a x;
    int y;
}b;

struct a 是一个包含 vector 的 struct,struct b 包含 struct 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 ** 中止(核心转储)” 此外,它不会将结构写入文件。

最佳答案

您不能写入和读取 vector ,因为它们在堆上分配数据。如果您的应用程序有实际限制,您可能会决定使用普通 C 数组更好(为了速度和清晰度,可能会牺牲存储空间):

#define MAXARR_A 100

typedef struct a_t
{
    int a[MAXARR_A];
    int p;
} a;

否则你必须通过写出一个大小然后转储数组数据来序列化你的 vector 。要读回它,您需要读取大小,然后调整 vector 的大小并将字节读入其中。

编辑:决定为您添加一些代码...它可能编译! =)

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) );
}

请注意,我没有包含任何错误检查...此外,将这些函数作为 readwrite 成员函数会更像 C++结构。

关于c++ - 将复杂结构读/写到二进制文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11928053/

相关文章:

c++ - 类对象集

c# - 从 C++/CLI 托管访问 C# 重载方法

c++ - 循环图中的对称轴

java - 如何读取文件的内容?

python - 用python写文件的正确方法

c++ - 将字符串映射到 vector 或将不同的键映射到一个值

c++ - std::vector 中包含的类中的 STL 字符串成员

c++ - Linux 如何处理多个进程同时尝试替换同一个文件的情况?

php - 在php中尚不存在的文件夹中创建文件

c - GCC 内联 SSE 代码