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

Ressaw

Frischling

  • »Ressaw« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Nähe von Krefeld

Beruf: Schüler

  • Private Nachricht senden

1

10.02.2011, 15:54

C++ Verkette Liste mit Objekten speichern und laden mit streams

Hallo,

ich habe für mein kleines Pong-Spiel eine Highscoreliste angefertigt, nur weiß ch nicht wie ich es schaffe sie abzuspeichern und zu laden.
Der Compiler gibt mir als Fehler eine Zugriffsverletzung an ,damit kann ich aber nix anfangen.
Die Liste m_Highscore enthält 10 Elemente es Typs CHighscoreEntry(string, unsigned long)

Speichern:

C-/C++-Quelltext

1
2
3
4
5
6
ofstream Output ("Highscore.hsc", ios::binary);
    for (m_It = m_Highscore.begin(); m_It != m_Highscore.end(); m_It++)
    {
        Output.write((char*)&(*m_It),sizeof((*m_It)));
    }
    Output.close();


Laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
ifstream Input ("Highscore.hsc", ios::binary);
    if (Input != NULL)
    {
        for (m_It = m_Highscore.begin(); m_It != m_Highscore.end(); m_It++)
        {
            Input.read((char*)&(*m_It),sizeof((*m_It)));
        }
    }
    Input.close();


Wenn ich m_Highscore als ganzes speichere, funktioniert es auch nicht.

Mfg, Ressaw

// Edit: Noch hinzuzufügen ist ,dass sich das Programm ausführen lässt und auch speichert/lädt. Der Fehler kommt erst beim benutzen der geladenen Highscoreeinträge.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ressaw« (10.02.2011, 16:07)


2

10.02.2011, 16:18

Machs ordentlich. Überlade für dein HighscoreEntry den stream-operator. Dannach kannst du einfach per std::copy alles in die Datei kopieren. Einen std::string so zu speichern, funktioniert nicht wirklich wie du es beabsichtigst/erhoffst ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Ressaw

Frischling

  • »Ressaw« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Nähe von Krefeld

Beruf: Schüler

  • Private Nachricht senden

3

10.02.2011, 17:13

Hmm ich hab jetzt ein bisschen rumprobiert und gegoogelt wie das mit dem überladen von den stream operatoren ist, jedoch weiß ich jetzt nicht genau wie ich das machen soll.

Bisher sieht die Überladung bei mir so

C-/C++-Quelltext

1
2
3
4
std::ostream &operator<<(std::ostream &ostr, std::string str)
    { 
     return ostr << str;
    }
aus, aber ich kriege eine Fehlermeldung, dass die Funktion zu viele Parameter übernimmt.
Auch weiß ich nicht wo genau ich die operatoren dann anwenden sollte.

Würd mich freuen wenn mir das jemand ein bisschen erklären könnte^^

// Edit: Fehler gefunden, der Operator muss "friend" sein, allerdings weiß ich nich, wie bzw wo ich das jetzt anwenden soll. Bitte um Hilfe ?(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ressaw« (10.02.2011, 21:20)


4

10.02.2011, 22:04

Zunächst solltest du den Stream-Operator (operator <<) für deine HighscoreEntry-Klasse überladen. Den genannten Operator für die Klasse std::string zu überladen, macht keinen Sinn, da dieser bereits überladen ist. Zumal sollten die "zu streamenden" Objekte als konstante Referenz übergeben werden und nicht als Kopie.

Zitat

// Edit: Fehler gefunden, der Operator muss "friend" sein, allerdings weiß ich nich, wie bzw wo ich das jetzt anwenden soll. Bitte um Hilfe ?(

Das ist kein Fehler und schon gar keiner, welcher dir bei deinem Problem weiterhilft. Der Operator muss nicht als friend-Funktion definiert werden. Er kann auch genauso gut auf die öffentliche Schnittstelle deiner HighscoreEntry-Klasse zugreifen.

Die Code-Beispiele von dir wirken etwas zusammenkopiert oder zumindest undurchdacht hinimprovisiert. Der Test auf Input != NULL lässt die Vermutung zu.

Tipp: Lese dich noch einmal in die Thematik ein und erstelle einen operator << für deine HighscoreEntry-Klasse (ohne friend). Spiele damit etwas auf der Konsolenausgabe (std::cout) herum. Wenn das sitzt, schreibe einen operator >> (für std::cin), um Entry-Objekte mit Werten zu versehen. Das wäre schon die halbe Miete zu deinem Highscore-Saver/Loader.

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

5

11.02.2011, 17:29

Achja ... und der Code oben soll so funktionieren wie du es beabsichtigst? Dann speicher mal was, starte neu und versuchs zu laden ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige