elemtvariablen in binarys speichern



  • hier der code einfach mal compilieren

    #include <fstream.h>
    
    class Animal
    {
    public:
       Animal(int weight, long days):itsWeight(weight),
              itsNumberDaysAlive(days){} 
       ~Animal(){}
    
       int GetWeight()const { return itsWeight; }
       void SetWeight(int weight) { itsWeight = weight; }
    
       long GetDaysAlive()const { return  itsNumberDaysAlive; }
       void SetDaysAlive(long days) { itsNumberDaysAlive = days; }
    
    private:
       int itsWeight;
       long itsNumberDaysAlive;
    };
    
    int main()   // liefert bei Fehler 1 zurück
    {
       char fileName[80];
    
       cout << "Bitte Dateinamen eingeben: ";
       cin >> fileName;
       ofstream fout(fileName,ios::binary);
       if (!fout)
       {
          cout << "Es ist nicht moeglich, " << fileName << 
                  " zum Schreiben zu oeffnen.\n";
          return(1);
       }
    
       Animal Bear(50,100);
       fout.write((char*) &Bear,sizeof Bear);
    
       fout.close();
    
       ifstream fin(fileName,ios::binary);
       if (!fin)
       {
          cout << "Es ist nicht moeglich, " << fileName << 
                  " zum Lesen zu oeffnen.\n";
          return(1);
       }
    
       Animal BearTwo(1,1);
    
       cout << "BearTwo Gewicht: " << BearTwo.GetWeight() << endl;
       cout << "BearTwo Tage: " << BearTwo.GetDaysAlive() << endl;
    
       fin.read((char*) &BearTwo, sizeof BearTwo);
    
       cout << "BearTwo Gewicht: " << BearTwo.GetWeight() << endl;
       cout << "BearTwo Tage: " << BearTwo.GetDaysAlive() << endl;
       fin.close();
       return 0;
    }
    

    warum steht in der ausgabe datei wenn man sie mit notepad aufmacht 2 d?

    gruss lookias



  • öffne die datei in einem hexeditor.

    dann steht da:

    32 00 00 00 64 00 00 00                       ; 2...d...
    


  • ah okay danke

    kannst mir das mal erklaehren

    mich wurmt die frage was passiert wenn man sone speicherung fuer ne andre klasse verwendet

    oder allgemein woher weiss das programm ueberhaupt wie es die daten da in die elementvariablen holt

    mfg lookias



  • lookias schrieb:

    ah okay danke

    kannst mir das mal erklaehren

    mich wurmt die frage was passiert wenn man sone speicherung fuer ne andre klasse verwendet

    oder allgemein woher weiss das programm ueberhaupt wie es die daten da in die elementvariablen holt

    mfg lookias

    ?? möchtest du die speicherbereiche erklärt haben, also stack, heap, register?
    oder meinst du das, dass durch das instanziieren ein objekt der klasse erstellt wird?

    in dem augentblick, wo du eine instanz der klasse in der main erstellst, wird ein objekt angelegt. entweder im stack oder im heap.
    hume sikkins sagte dazu mal, aus rohem speicher lebbare masse gemacht 😉



  • na wenn man die datei speichert dann werden doch alle zugehoerigen daten aus den elementvariablen in die datei gespeichert

    aber nach welchem prinzip funktioniert das?

    vlt nach reinfolge der deklaration also

    int itsWeight;
    long itsNumberDaysAlive;
    

    😕



  • mir ist nicht ganz klar, was du mit "datei" meinst..

    vielleicht mal aus der bibliothek ein schon altes buch leihen: reiner backer - programmiersprache assembler, der hat gut beschrieben, wie der quelltext zum .obj und dann zur ausführbaren datei gelinkt wird.
    im grunde google mal nach maschinensprache... und schau dir die begriffe compiler und linker mit aufgabenbereich an..

    oder wolltest du nicht so "tief" runter?



  • vlt nach reinfolge der deklaration also

    ja 🙂



  • Hier ist write (und auf der selben Seite auch read) erklärt.
    Mit

    fout.write((char*) &Bear,sizeof Bear);
    

    schreibst du also 8 Bytes (bei mir) von der Addresse von Bear angefangen. Hast du erwartet, dass in der Datei 50 und 100 als "lesbare" Zahlen stehen. Sie werden aber binär in die Datei geschrieben. Wenn du 50 in einer Textdatei lesen kannst, ist das etwas anderes als der Wert 50 in einer int Variable!
    (Hilft dir das nun weiter?)



  • jo

    dass man nicht 50 und 100 erwarten kann ja

    dass man das nach reihenfolge der deklaration speichert wars

    also ist sizeoff bear die summe der laengen der bytes der variablen der klasse bear?



  • ja aber die compiler richten die einzelnen variablen meistens an wortgrenzen aus so das z.B.

    int i; // 4 bytes
    char c; // 1 byte

    z.B. 8 byte ergeben. sizeof gibt dann aber auch 8 zurück.



  • weil int den groessten speicher alociert?

    also waers long int dann waerens hier 16 byte ja?



  • long ist auf 32-bit systemen das gleiche wie int. also 4 bytes.



  • ok aber nach dem system oder wie?


Anmelden zum Antworten