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

Montana

Frischling

  • »Montana« ist der Autor dieses Themas

Beiträge: 6

Beruf: Medieninformatik-Student

  • Private Nachricht senden

1

28.02.2006, 03:09

Frage bzgl. Schreiben & Einlesen v. Werten in Dateien

Sitze gerade an Listing 8.8 und zerbreche mir über folgende Zeile den Kopf:

C-/C++-Quelltext

1
Output.write ((char*) &Highscore, sizeof (Highscore));


Ich verstehe nicht wirklich den Sinn und Zweck des Castings der Adresse von Highscore in einen Char-Zeiger. Vor allem Dingen, was da genau passiert. Es wird erstmal die Adresse der Variablen Highscore geholt, so weit alles klar...aber mir ist es momentan ein Rätsel, was wirklich passiert und dahinter steckt, wenn diese Adresse in einen char-Zeiger gecastet wird. Wieso char, und vor allem worauf wird nach dem Casting gezeigt?

Soweit ich das verstanden habe, soll doch der Integer-Wert der Variablen Highscore in einer Datei binär-codiert gespeichert werden. Wieso kann man also nicht die Variable selber direkt sowie dessen Größe an Output.write übergeben? ???

PS: Was ich noch loswerden wollte...find's super, dass es zu diesem exzellenten Buch auch ein Support-Forum gibt :huhu:
"The software business is binary. You're either a one or a zero, alive or dead."

2

28.02.2006, 09:25

Eigentlich wird hier der Wert in einen char gecastet und der Zeiger zeigt immer noch auf diese Variable, nur das diese hal jetzt ein char ist.
Korrigiert mich wenn ich jetzt falsch liege.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Anonymous

unregistriert

3

28.02.2006, 09:47

Integerzahlen sind auf 32bit-Systemen 4 Byte groß - liegen also mit 4 Bytes (=4 characters) hintereinander im Speicher.

Über &Highscore bekommt man einen Zeiger auf das erste der 4 Bytes. Mit
sizeof(Highscore) bekommt man die Größe des Integers - also 4 Byte
meistens. Es ist übrigens guter Stil hier sizeof() zu verwenden - denn dann
läuft der Code auch auf 64Bit Systemen unverändert.

Durch das casten auf (char *) verhindert man lediglich ein Warnung des
Compilers über eine ungültige/verdächtige Typkonvertierung denn (so weit
ich mich erinnere) erwartet die write-Funktion einen char * als Argument.
Durch den Aufruf

C-/C++-Quelltext

1
Output.write ((char*) &Highscore, sizeof (Highscore));


Werden nun also 4 Bytes aus dem Speicher in die Datei geschrieben. Durch
das entsprechende read()-Kommando kann man dann später die Integer-
Zahl wieder einlesen.

Nachteil dieser Methode: So gespeicherte Dateien sind NICHT portabel
zwischen 32 und 64 Bit-Systemen und auch solchen die anstatt der Little-
die Big Endian Reihenfolge verwenden.

Ich persönlich bevorzuge darum das Speichern als Klartext - wenns ums
Platz sparen geht kann man ja einen bz2-Stream verwenden.

Grüße
Stefan

Werbeanzeige