バイナリファイルに間違って書き込みしていると思います。グレードやユニットなどの詳細を含むリストに大学のコースを追加するプログラムを作成することになっています。配列にアイテムを追加するたびに配列の容量を倍増することになっています(doubleArrayCapacity関数)C++動的配列のシリアライズ
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倍にすると、初期化されていないデータが効果的に配列に挿入されます。 – Meixner
BTW:このデータをディスクに書き出すことは、数値が異なる表現(ビッグエンディアンとリトルエンディアン)を持つ可能性があり、データ型のアラインメントが構造体の異なるパディングにつながる異なる要件を持つ可能性があるため、 – Meixner