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

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

1

28.04.2007, 09:20

Listeneinträge in eine Datei schreiben und auslesen

Hallo zusammen.

Ich arbeite gerade an einer Highscoreliste. Und ich habe folgendes Problem. Ich kann keine Einträge von Listen in die Datei schreiben und dann wieder auslesen. Ist es möglich, dass es normal gar nicht geht?

also ich habe es so gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void CHighscore::read ()
{
    ifstream In;
    In.open ("Highscore.txt");

    for ( it = m_HighscoreList.begin (); it != m_HighscoreList.end (); ++it);
    {
        In.read ((char * ) &it , sizeof (CMember));
    }

    In.close ();
}


Wobei "Member" einen Eintrag in der Liste darstellt. Darum gebe ich die Grösse von dieser Klasse an.

Ich habe es jetzt sogra mal mit einer Liste von Zeigern auf Member probiert. Funktioniert auch nicht.

Ist es möglich, dass es gar nicht geschickt geht mit der Liste einträge in eine Datei zu schreiben, respektive auszulesen?

lg drakon

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

28.04.2007, 09:25

Doch das geht, aber du gehst es halt falsch an. Erstmal wäre es schön zu wissen wie die Deklaration von CMember aussieht, außerdem wäre die Methode zu schreiben interessant (ich vermute mal da machst du ähnliche Fehler).

Wenn CMember Strings als Membervariablen haben sollte gibt der sizeof() Operator nicht die tatsächliche Größe zurück, klar oder?

grüße
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

28.04.2007, 10:11

Außerdem sollte man nicht gerade den Iterator in der Größe von CMember abspeichern^^

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

28.04.2007, 10:27

Zitat von »"grek40"«

Außerdem sollte man nicht gerade den Iterator in der Größe von CMember abspeichern^^


Ohja, das kommt noch erschwerend hinzu! ;) Hab ich total übersehen! :)
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

28.04.2007, 15:41

eine mögliche Herangehensweis e(Pseudocode):

Quellcode

1
2
3
4
Alte Liste löschen
Anzahl der in der Datei gespeicherten Listenelemente auslesen (NumElemente)
for(counter < NumElemente; counter++)
Den Wert aus der Datei auslesen 


Am leichtesten ist es, wenn deine Datei einfach nur zahlen enthält. bei String muss man entweder wieder ein Terminalzeichen haben(neue Zeile,\0 o.ä). Bei reinen Binärdateien bietet es sich wohl an die größe des String anzugeben (ähnlich wie bei der Liste).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

28.04.2007, 17:29

Zitat von »"Nox"«

eine mögliche Herangehensweis e(Pseudocode):

Quellcode

1
2
3
4
Alte Liste löschen
Anzahl der in der Datei gespeicherten Listenelemente auslesen (NumElemente)
for(counter < NumElemente; counter++)
Den Wert aus der Datei auslesen 


Am leichtesten ist es, wenn deine Datei einfach nur zahlen enthält. bei String muss man entweder wieder ein Terminalzeichen haben(neue Zeile,\0 o.ä). Bei reinen Binärdateien bietet es sich wohl an die größe des String anzugeben (ähnlich wie bei der Liste).


Ich denke drakon's Problem liegt woanders! :)
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

28.04.2007, 18:44

Ähm, naja also ich sehe hier ein grundlegendes Missverständnis, weil das ganze meiner Ansicht nach so garnicht funktionieren kann(lasse mich gerne eines besseren belehren, habe selbst lange gebraucht bis ich das serialisieren und deserialisieren wirklich hinbekommen habe).

Es fängt schon damit an, dass

for ( it = m_HighscoreList.begin (); it != m_HighscoreList.end (); ++it);

einen klassischer Flüchtigkeitsfehler enthält(siehe leere Anweisung). Auch stellt sich mir die Frage, woher die Anzahl der Listenelemente gleich der Anzahl der Elemente in der Datei sein sollten.

Wenn die Anzahl der Einträge immer festgelegt ist, würde ich zu einem Array raten :)

Ansonsten muss man ja die Anzahl der Elemente vorher angeben oder per Terminalzeichen begrenzen, weil wie sonst sollte das Programm wissen, wieviele Einträge von Elementen in der Datei enthalten sein sollen?

Aber wo siehst du das Problem?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

28.04.2007, 20:43

Es gibt einige Proble, u.A. das welches du eben angesprochen hast. Aber das Hauptproblem sehe ich darin das drakon anscheinend noch nicht ganz durchblickt bei der verwendung von sizeof. ;) Ich mag mich irren, aber es sieht stark danach aus.
Dann hat er Iteratoren anscheinend noch nicht vollständig begriffen uswusw... Naja, einiges halt! :)
@D13_Dreinig

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

29.04.2007, 19:14

sorry, dass es so lange gedauert hat.
aber danke für die antworten. ich habe mit gedacht, dass es irgendwie gar nicht gehen kann. und das mit der länge des strings habe ich mir auch gedacht...nun habe ich aber mal ein kleines testprogramm geschrieben, indem es mit den strings funktioniert hat. und darum habe ich gedacht, dass es auch so funktionieren kann.

nun werde ich es mal etwas anderes probieren mit einem array...aber nicht heute..;-)- ich beschränke nämlich dann die anzahl und dann sollte es vlt. auch gehen.- mal schauen.

was ist dann da falsch? ich habe das so aus dem Buch c++ für spieleprogrammierer...

C-/C++-Quelltext

1
for ( it = m_HighscoreList.begin (); it != m_HighscoreList.end (); ++it);


was ist dann mit sizeof falsch? ich habe gedacht, dass er einfach die grösse des angegebenen parameters zurückgibt...klar mit einem variablen string kann er das nicht...aber ich hätte gedacht, dass wenn es da irgendein problem gibt mich der kompiler darauf aufmerksam macht...

und der iterator habe ich soweit begriffen, dass ich ihn bis jetzt immer richtig eingesetzt habe...und es immer funktioniert hat...genauer wurde er eben nicht erklärt...

@Nox:
was meinst du mit serialisieren und deserialisieren? was ist das für ein thema??

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

29.04.2007, 19:19

Hi!

Was ist daran falsch:
Im Grunde nichts, allerdings verwendest du die Schleife zum einlesen d.h. du hättest vorher dein vector entsprechend vergrößern- und die Objekte schon einfügen müssen.

sizeof
Genau das macht sizeof, aber sizeof auf einen Zeiger angewendet gibt nicht die Größe des dahinter befindlichen Speichers zurück sondern die Größe des Zeigers. Also 4, 8, ...
Und da das genau der Idee entspricht gibt der Compiler auch keine Fehlermeldung o.ä. raus

iterator
Du hast versucht den Iterator zu speichern und nicht das Objekt auf das der Iterator referenzierte.

noxfrage
Er meint damit das Speichern/Laden von Objekten Physikalisch auf einen Datenträger.
Siehe: http://de.wikipedia.org/wiki/Serialisierung
@D13_Dreinig

Werbeanzeige