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

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

1

26.06.2009, 13:02

speichern und laden von klassen mit std::string member

ich hab hier zwei funktionen zum laden und speichern einer liste. Elemente der Liste ist eine klasse, die aus zwei membern besteht: ein int wert und ein std::string. beim auslesen der werte und ausgeben des inhalts kommen aber nur wirre zeichen. muss beim auslesen bzw. speichern der datei noch zusätzlich etwas berücksichtigen, da ich hier einen std::string als member habe? ich hab die probleme erst seit der umstellung auf code::blocks und mingw.
danke
gruss

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
37
38
39
40
41
void SaveData()
{
    int iListSize=MyList.size();
    std::cout << "ListSize: " << iListSize << std::endl;
    std::ofstream fileOut("./MyFile.sav",std::ios::out | std::ios::binary);
    if(fileOut)
    {
        std::cout << "File wurde zum Schreiben geöffnet!" << std::endl;
        fileOut.write((char *) &iListSize,sizeof(iListSize));
        for (it=MyList.begin();it!=MyList.end();it++)
        {
            fileOut.write((char *) &(*it),sizeof(*it));
        }
    }
    else
        std::cout << "File could not be saved" << std::endl;
    fileOut.close();
}

void LoadData()
{
    CEntry lastEntry;
    MyList.clear();
    int iListSize=0;
    std::ifstream fileIN("./MyFile.sav",std::ios::in | std::ios::binary);
    if(fileIN)
    {
        std::cout << "File wurde zum Lesen geöffnet!" << std::endl;
        fileIN.read((char *) &iListSize,sizeof(iListSize));
        it=MyList.begin();
        for (int i=1;i!=iListSize;i++)
        {
            fileIN.read((char *) &(lastEntry),sizeof(lastEntry));
            std::cout << "read value: " << lastEntry.m_iValue << "\t" << lastEntry.m_sID << std::endl;
            MyList.push_back(lastEntry);
        }
    }
    else
        std::cout << "File could not be saved" << std::endl;
    fileIN.close();
}

2

26.06.2009, 13:33

Du schreibst den std::string Binär in die Datei statt seines Inhaltes. Du musst die String Länge und dann den Inhalt, oder alternativ einen Nullterminierten String in die datei schreiben.
Lieber dumm fragen, als dumm bleiben!

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

3

26.06.2009, 16:28

Zitat von »"Jonathan_Klein"«

Du schreibst den std::string Binär in die Datei statt seines Inhaltes. Du musst die String Länge und dann den Inhalt, oder alternativ einen Nullterminierten String in die datei schreiben.


Hallo, danke für die Hilfe.
ok ich vermute der string hat ja an sich keine vorgegebene Größe und daher die Probleme, da sizeof(std::string) nicht definiert ist.
Aber wieso funktioniert das, wenn ich vc++2008 verwende einwandfrei und wenn ich mingw verwende geht es nicht. Hängt vc++2008 im Gegensatz zu mingw automatisch einen \0 an den string an? Müsste sich das dann nicht auch irgendwo einstellen lassen ?

Gruss

4

26.06.2009, 16:47

Wenn es geht, dann ist das pures Glück, verlassen kannst du dich darauf nicht. Es gibt eben verschiedene STL Versionen, aber einen Standard nach dem sich alle richten müssen und der sagt nicht, dass man einen String einfach so speichern kann.
Bevor ich für fast alles XML benutzt habe, habe ich immer erst ein unsigned int für die Stringlänge und dann die Stringdaten via string.c_str() in die Datei geschrieben.
Lieber dumm fragen, als dumm bleiben!

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

5

26.06.2009, 16:53

Zitat von »"Jonathan_Klein"«

Wenn es geht, dann ist das pures Glück, verlassen kannst du dich darauf nicht. Es gibt eben verschiedene STL Versionen, aber einen Standard nach dem sich alle richten müssen und der sagt nicht, dass man einen String einfach so speichern kann.
Bevor ich für fast alles XML benutzt habe, habe ich immer erst ein unsigned int für die Stringlänge und dann die Stringdaten via string.c_str() in die Datei geschrieben.


ok. Macht ja letztlich auch Sinn. So wie du es vorschlägst hatte ich es jetzt auch gelöst.
danke nochmal für deine Hilfe.

Werbeanzeige