[英]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個潛在問題
fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course));
序列化的正確性取決於Course
對象的內部布局和數據成員的對齊方式。 void doubleArrayCapacity
函數的實現中。 您需要實現Course
分配運算符,以使語句temp[i] = array[i];
會做你想要的。 無論如何,我建議您:
另一種選擇是將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.