Lesen aus Binärdatei



  • Hallo!

    Ich lese das erste mal aus binären Dateien. Ich hab eine Frage dazu, wie das funktioniert. Zuerst dachte ich, das ginge nur indem ich structs benutze. Dann hab ich gemerkt, das es auch mit Klassen geht.

    Dann hab ich gemerkt, das es auch geht wenn die Klassen funktionen besitzt. Oder wenn die Klasse mehr Variablen besitzt als gelesen werden, solange die, die gelesen werden "oben" stehen:

    namespace Q3BSP
    {
    	class Header
    	{
    		public:
    			int machwas()//geht
    			{
    				return(23);
    			}
    int foo;//geht nicht mehr
    			char magic[4]; // Identifies the map file (must be "IBSP")
    			int version; // Version of the map file (Quake3 uses version 46)
    			int uhuh;//geht
    	};
    }
    
    Q3BSP::Header header;
    	fread(&header, 1, sizeof(Q3BSP::Header), fp);
    

    Wieso ist das so? Kann mir das jemand genauer erklären? 😋



  • Wenn du ein Objekt deiner Klasse Header erzeugst, wird ein zusammenhängender Speicherbereich reserviert, der groß genug ist, um alle membervariablen abzuspeichern. Die Reihenfolge der Variablen ergibt sich nur aus der Reihenfolge der Deklarationen in der Klasse.

    Die Funktion fread macht nichts anderes, als eine bestimmte Anzahl Bytes aus einer Datei in den angegebenen Speicherbereich zu kopieren. Fread kennt die Struktur der Datei oder der Klasse nicht. Wenn du jetzt eine Klasse definierst, in der die Membervariablen in der Reihenfolge deklariert sind, wie sie auch in der Datei stehen, funktioniert das Lesen natürlich. Wenn aber in der Klasse vor den Variablen in die du lesen möchtest schon Variablendeklarationen sind, verschiebt sich das ganze natürlich. Dann hast du z.B. das, was in char[4] magic stehen sollte am Ende in foo stehen, version in magic usw.

    Methodendeklarationen und statische Variablen haben darauf natürlich keinen Einfluss, weil diese ja nicht in jedes erzeugte Objekt kopiert werden, sondern nur einmal im Speicher existieren.

    Ich hoffe, meine Erklärung war einigermaßen verständlich und konnte dir weiterhelfen.


Anmelden zum Antworten