簡體   English   中英

C ++序列化動態數組

[英]C++ Serializing a dynamic array

我認為我在向二進制文件中寫入錯誤。 我們應該創建一個程序,使我們可以將大學課程添加到列表中,其中包含諸如年級,單位等詳細信息。我們還應該在每次向數組中添加項目時使數組容量加倍(因此,功能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項被讀取為null或零。 我認為我沒有將數據正確輸出到二進制文件。 誰能看到我在做什么錯?

如我所見,您這里有2個潛在問題

  1. 第一個問題是序列化, fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course)); 序列化的正確性取決於Course對象的內部布局和數據成員的對齊方式。
  2. 第二個潛在問題是在void doubleArrayCapacity函數的實現中。 您需要實現Course分配運算符,以使語句temp[i] = array[i]; 會做你想要的。

無論如何,我建議您:

  1. 審查“課程”數據成員的對齊方式
  2. 確保“課程”沒有復雜的數據成員和指針。

另一種選擇是將serialize方法添加到Course類並反序列化構造函數。

您將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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM