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

1

24.06.2012, 15:54

C++ - Struktur in eine binäre Datei schreiben - Fehler beim Beenden des Fensters

Hallo Community!
Ich bin gerade dabei eine Instanz einer Struktur in eine Datei binär zu schreiben und sie danach rauszulesen.
Das hineinschreiben funktioniert daweil, jedoch gibt es beim auslesen, beim Beenden des Programms einen Fehler.
Er tritt in der main.cpp bei der Rückgabe eines Wertes(in meinem Falle: 0) auf.
Hier ist der Code fürs Laden(read):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//Spielstand laden
void CMenu::LoadScore()
{   
    char loadPath[50];
    for(int i=0;i < 3;i++)
    {
        std::ifstream openFile;
        sprintf_s(loadPath, "Data/Score/Score%i.load", i+1);
        openFile.open(loadPath, std::ios::binary | std::ios::in);
        openFile.read((char *)&score[i], sizeof(score[i]));
        openFile.close();
    }   
}

Hier st der Code fürs Speichern(write)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Spielstand speichern
void CMenu::SaveScore(int scoreid)
{
    score[scoreid].Level = 1;
    score[scoreid].Name = sf::String("NOTHING");
    std::ofstream openFile;
    char savePath[50];
    sprintf_s(savePath, "Data/Score/Score%i.load", scoreid+1);
    openFile.open(savePath, std::ios::binary | std::ios::out);
    openFile.write((char *)&score[scoreid], sizeof(score[scoreid]));
    openFile.close();
}


Error:

(Link)


Danke im voraus an alle Helfer und Mitdenker

lg denniro
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

24.06.2012, 16:09

C-/C++-Quelltext

1
score[scoreid].Name = sf::String("NOTHING");

Da ist der Übeltäter.
"Name" ist ein sf::String-Objekt.
Das kannst du nicht einfach so binär in eine Datei schreiben, weil es einen Zeiger auf die String-Daten enthält.
Was du in die Datei geschrieben hast, ist nur die Adresse der Daten und vielleicht noch die Länge des Strings (ich weiß nicht genau, wie sf::String aufgebaut ist).
Die eigentlichen Daten, also der Text, sind gar nicht in der Datei drin.
Beim Einlesen zeigt der Zeiger dann "irgendwohin" ...
Da musst du dir jetzt eine bessere Lösung einfallen lassen!

3

24.06.2012, 16:15

Danke für deine Hilfe, ich werde es mal anders probieren!
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

24.06.2012, 16:18

Sag uns bescheid, wie du es gemacht hast ;)

5

24.06.2012, 16:46

Gelöst.
Die, in der Struktur vorhandene Klasse sf::string, wurde durch std::string ersetzt, anschließend wurde der herausgelesene String der Klasse sf::string übergeben.
Nochmal danke für die Weisung auf den richtigen Weg ;)
Only God can judge me.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

24.06.2012, 18:16

Gelöst.
Die, in der Struktur vorhandene Klasse sf::string, wurde durch std::string ersetzt, anschließend wurde der herausgelesene String der Klasse sf::string übergeben.
Nochmal danke für die Weisung auf den richtigen Weg ;)


Hört sich für micht nicht ok an. Kannst du den Code mal posten?
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

24.06.2012, 19:04

Würde mich auch extrem wundern, wenn das funktionieren würde.
std::string löst das Problem nicht, weil es genau das gleiche ist!

8

24.06.2012, 21:15

Hier der Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Spielstand speichern
void CMenu::SaveScore(int scoreid, int level)
{
    score[scoreid].Level = level;
    if(level == 0)
        score[scoreid].scoreName = "empty";
    else
        score[scoreid].scoreName = scoreText[scoreid].ToAnsiString();
    std::ofstream openFile;
    char savePath[50];
    sprintf_s(savePath, "Data/Score/Score%i.load", scoreid+1);
    openFile.open(savePath, std::ios::out | std::ios::binary);
    if(openFile.is_open())
        openFile.write((char *)&score[scoreid], sizeof(score[scoreid]));
    openFile.close();
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Spielstand laden
void CMenu::LoadScore()
{   
    char loadPath[50];
    for(int i=0;i < 3;i++)
    {
        std::ifstream openFile;
        sprintf_s(loadPath, "Data/Score/Score%i.load", i+1);
        openFile.open(loadPath, std::ios::in | std::ios::binary);
        if(openFile.is_open())
        {
            openFile.read((char *)&score[i], sizeof(score[i]));
            scoreText[i] = sf::String(score[i].scoreName.c_str());
        }
        openFile.close();
    }   
}


C-/C++-Quelltext

1
2
3
4
5
struct loadedScore
{
    std::string scoreName;
    int Level;
};


lg. denniro
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

24.06.2012, 21:22

Kann nicht funktionieren.
Hast du das überhaupt mal getestet? Wichtig: zwischen Speichern und Laden mal das Programm beenden!
Und guck mal in deine erzeugte Datei rein. Du wirst sehen, dass dort keine Spur von dem Text ist, den du eigentlich speichern willst.

10

24.06.2012, 21:24

Kann nicht funktionieren.
Hast du das überhaupt mal getestet? Wichtig: zwischen Speichern und Laden mal das Programm beenden!
Und guck mal in deine erzeugte Datei rein. Du wirst sehen, dass dort keine Spur von dem Text ist, den du eigentlich speichern willst.

Es funktioniert, ehrlich :D In der Datei ist der String vorhanden(die Zeichen dieses sind in der richtigen Reihenfolge).
Only God can judge me.

Werbeanzeige