我想我写错了二进制文件。我们应该创建一个程序,让我们将我们的大学课程添加到列表中,其中包含等级,单位等详细信息。每当我们向数组添加项目时,我们也应该将数组容量加倍(因此功能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项读为空或零。我想我没有正确地将我的数据输出到我的二进制文件。谁能看到我做错了什么?
答案 0 :(得分:1)
正如我所看到的,这里有两个潜在的问题
fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course));
序列化的正确性取决于Course
对象的数据成员的内部布局和对齐方式。 void doubleArrayCapacity
函数的实现。您需要实现Course
赋值运算符,以使语句temp[i] = array[i];
能够执行您想要的操作。无论如何,我建议你:
另一种选择是将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));