Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

21

01.04.2011, 13:04

Da es in diesem Thread um speichern und laden geht, stelle ich mal hier meine Frage (und mache nicht extra einen neuen Thread auf):
Also ich habe gerade versucht über if- und ofstream eine Klasse direkt zu speichern und habe mir dafür (also zum testen) diese kleine Klasse erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Name{
public:
    Name(){return;};
    ~Name(){return;};

    string mName;
    string mVorname;
};

Wenn ich nun eine Name-Klasse speichern und dann wieder laden wollte, hat das auch funktioniert, aber sobalt ich das mit zweien machen wollte, gab es einen Fehler! Hier ist der Code der Save- und Load-Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool Save(){
    Name CName;
    CName.mName = "Mustermann";
    CName.mVorname = "Max";

    ofstream Output("Save.txt",ios::binary);
    Output.write ((char*) &CName, sizeof (CName));

    cout << "Name: " << CName.mName << "\nVorname: " << CName.mVorname << endl;

    CName.mName = "Mustermann";
    CName.mVorname = "Karl";

    Output.write ((char*) &CName, sizeof (CName));
    Output.close ();

    cout << "\nName: " << CName.mName << "\nVorname: " << CName.mVorname << endl;

    return true;
}

bool Load(){
    Name CName;

    ifstream Input ("Save.txt", ios::binary);
    Input.read ((char*) &CName, sizeof (CName));

    cout << "\n\nName: " << CName.mName << "\nVorname: " << CName.mVorname << endl;

    Input.read ((char*) &CName, sizeof (CName));
    Input.close ();

    cout << "\n\nName: " << CName.mName << "\nVorname: " << CName.mVorname << endl;

    return true;
}


Was habe ich falsch gemacht?

Mfg Harry222

22

01.04.2011, 14:00

Das geht so nicht. Du kansnt nicht einfach strings hintereinander in die Datei schreiben, woher soll er beim lesen wissen, wann der erste String aufhört und wann der zweite anfängt?
Du kannst die nichtmal einfach so in die Datei schreiben, sondern muss auch den Inhalt in die Datei schreiben. ein Stringobjekt hat intern einen Pointer auf die einzelnen Zeichen du schreibst derzeit nur den Pointer in die Datei, und das ist ziemlich nutzlos.
Du könntest z.B. erst die Länge in die Datei schreiben (str.length() oder so) und dann die einzelnen zeichen (string.c_str(), sizeof(char)*str.length()) oder halt beim lesen bis zum \0 lesen, was auch irgendwie fummelig ist.

Einfacher ist es, primitive Datentypen (int, float, char, NICHT char*) in Dateien zu schreiben, komplexere Datentypen (Container wie std::string, std::list, Pointer, Referenzen) machen da schon einiges mehr an Ärger.

boost::serialization nimmt dir da viel ab, aber es mag für dich noch zu komplex sein (weil man imemr grob verstehen sollte, was im hintergrund passiert). ticpp ist aber auch schön, das könntest du dir auch mal ansehen.
Lieber dumm fragen, als dumm bleiben!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

01.04.2011, 15:47

Ein einfaches "Output << mName" und "Input >> mName" hätte es schon getan statt read und write. Aber das sagte ich ja bereits vorher schon.
Den Grund hat Jonathan prima erklärt.
Noch besser wäre wie gesagt boost oder die Erstellung der Stream-Operatoren für den komplexen Datentyp.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige