Sorry, aber diesen Wust werde ich mir nicht antun, zumal der aktuell Code Tag grausam ist. Im dunklen Design ist er faktisch unlesbar. Und da er nur 80 Zeichen breit ist, dein Code aber meher hundert Zeichen breit, allerdings der Scrollbalken nur ganz unten ist, ist das mehr als unleserlich. Und man kann nichtmal mit STRG+A den Quellcode markieren, um ihn in einem anderen Editor zu kopieren. Du solltest dir einen kuerzeren Codestil zulegen. EOE80 oder EOE120 maximal. Aber ich weiss selbst, wie schwer das ist.
Edit: Ok, ich hab mir doch mal die Muehe gemacht, den Code in einen Editor zu kopieren und nen fluechtigen Blick drauf zu werfen.
Das ist riesiger Bloedsinn. ostream.write kannst du im Grunde nur auf SDTs (Simple Data Types) anwenden, also auf byte, int, float, char und ihre arrays.
Mit komplizierten Datentypen wie Structs, Classes oder Pointern funktioniert das nicht, wenn du auch bei einem struct ohne Methoden zufaellig Glueck haben kannst.
Der Grund ist der, dass bei komplexen Datenstrukturen zusaetzliche Informationen gespeichert werden, die du so nicht zu Gesicht bekommst, wie Alignments im Speicher fuer schnelleren Datenzugriff, Loop-Up-Tabellen virtueller Methoden, Referenzen auf Elternklassen, Methodenpointer, usw. Wenn du nun so ein Objekt direkt in eine Datei schreibst, wird auch das genau gemacht: eine Kopie des aktuellen Objektes. Wenn du es aber wieder einladen willst, kommt nur noch schrott raus. Ueberall dort, wo du eine Array oder einen Pointer im Datentyp hast (und in Classes hast du viele Pointer, auch wenn du sie nicht immer siehst), wird ja nicht der Inhalt des Pointers gespeichert, sondern nur die Addresse, worauf er zeigt. Beim Einlesen liest er auch nur diese Addresse und dagt dem Objekt "Dort stehen deine Daten". Da diese Daten aber niemals gespeichert wurde, zeigt nun der Pointer irgendwo ins Nirvana, und dort kann alles moegliche stehen, und das ist fuer dein Programm einfach nur Datenmuell. Daher bekommst du nach jedem Neustart auch andere Werte, da der Pointer nach dem Einladen immer an die selbe Stelle zeigt, aber immer was anderes drin steht.
Wie loest man nun das Problem ? Dazu wuerde ich dir empfehlen, dass du statt ostream.write einfach den << und den >> operator verwendest. Du solltest fuer ALLE(!) deine Klassen, die du speichern willst, den istream& operator>>(istream& instream) fuer die Eingabe und den ostream& operator<< (ostream& outstream) fuer die Ausgabe ueberladen. Diese Operatoren geben dann z.B. ueber outstream << fWeight; die Daten der einzelnen SDTs in den Stream aus bzw lesen sie in der selben Reihenfolge ein. Wenn du einen Member hast, der dynamisch alloziiert wird (z.B. ein Array mittels new) dann erzeugst du das entsprechende Array und liest alle Werte einzeln ein. Wenn deine Klasse Member hat, die ihrerseits Objekte sind, rufst du den entsprechenden operator>> oder operator<< der dazugehoehrigen Klasse auf, so dass sich die Klasse selber darum kuemmert. Wenn du allerdings nicht von dir geschriebene Objekte hast, die die >> und << nicht implementieren, musst du selbst Hand anlegen, z.B. bei std::vector<typ>. Im operator<< machst du dann sowas wie
und im operator>> machst du dann den umgekehrten Code
Wenn du das alles sauber und stimmig implementiert hast, so dass deine I/O nur noch auf SDTs basiert, klappt das auch mit dem Einlesen und Auslesen.