C ++序列化动态数组

时间:2016-10-27 06:14:59

标签: c++ arrays serialization

我想我写错了二进制文件。我们应该创建一个程序,让我们将我们的大学课程添加到列表中,其中包含等级,单位等详细信息。每当我们向数组添加项目时,我们也应该将数组容量加倍(因此功能doubleArrayCapacity)

  void doubleArrayCapacity(Course*&, int&, int);

  ...

  int cap = 2;
  int size = 0;
  Course* courses = new Course[cap];

  fstream fin;
  fin.open("myCollegeCourses.9.bat", ios::binary|ios::in);
  if (fin.good())
  {
    fin.read(reinterpret_cast<char*>(&size), sizeof(size));
    doubleArrayCapacity(courses, cap, size);
    fin.read(reinterpret_cast<char*>(courses), cap * sizeof(Course));
  }
  fin.close();

  ...

  fstream fout;
  fout.open("myCollegeCourses.9.bat", ios::binary|ios::out);
  fout.write(reinterpret_cast<char*>(&size), sizeof(size));
  fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course));
  fout.close();

  ...

  void doubleArrayCapacity(Course*& array, int& capacity, int newCapacity)
  {
    Course* temp = new Course[2 * capacity];
    for (int i = 0; i < capacity; i++)
      temp[i] = array[i];
    delete [ ] array;
    array = temp;
    capacity = newCapacity * 2;
  }

如果我向我的数组添加4个项目,程序运行正常。一旦我到达5个对象,就会发生错误。文件未正确读回,第5项读为空或零。我想我没有正确地将我的数据输出到我的二进制文件。谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:1)

正如我所看到的,这里有两个潜在的问题

  1. 第一个问题出在序列化中,fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course));序列化的正确性取决于Course对象的数据成员的内部布局和对齐方式。
  2. 第二个潜在问题是void doubleArrayCapacity函数的实现。您需要实现Course赋值运算符,以使语句temp[i] = array[i];能够执行您想要的操作。
  3. 无论如何,我建议你:

    1. 查看&#39;课程&#39;
    2. 的数据成员的对齐方式
    3. 确保&#39;课程&#39;没有复杂的数据成员和指针。
    4. 另一种选择是将serialize方法添加到Course类并反序列化构造函数。

答案 1 :(得分:0)

您将size写入文件,这会告诉您有多少项目。然后打开文件并阅读size。但是你忘了使用size

在此处将cap更改为size

fin.read(reinterpret_cast<char*>(&size), sizeof(size));
doubleArrayCapacity(courses, cap, size);

//fin.read(reinterpret_cast<char*>(courses), cap * sizeof(Course));    
fin.read(reinterpret_cast<char*>(courses), size * sizeof(Course));