struct in datei speichern



  • Hallo!

    also sagen wir ich habe ein solches struct:

    struct Auto {
    Integer Nummer;
    String Marke;
    String Typ;
    Integer PS;
    };
    
    Auto s_auto;
    s_auto.Nummer = 1;
    s_auto.Marke = "BMW";
    s_auto.Typ = "7er";
    s_auto.PS = 360;
    

    wie kann ich nun diesen struct (sagt man so?) in der Datei autos.dat speichern ?
    und brauch ich das Datenfeld "Nummer" ? oder wird automatisch beim anlegen einer structdatei ein index erstellt ?

    danke im voraus
    Johannes



  • mit String ist das nicht so einfach.

    besser:

    struct Auto { 
    Integer Nummer; 
    char Marke[100]; 
    char Typ [100]; 
    Integer PS; 
    };
    

    dann kannste sowas machen:

    TFileStream* stream=new TFileStream("C:\\test.dat",fmCreate);
       Auto car;
      car.Nummber=122;
      strcpy(car.Marke,"Audi");
      strcpy(car.Typ,"Kombi");
      car.PS=180;
       stream->Write((void*)&car,sizeof(car));
     delete Stream;
    

    auslesen kannste dann:

    Auto car;
       TFileStream* stream=new TFileStream(("C:\\test.dat",,fmOpenRead);
       stream->Read((void*)&car,sizeof(car));
     // mach was mit car
    
    delete stream;
    


  • oder du bastelst dir noch 2 zusaetzliche funktionen, die dir aus den daten deines structs einen stream macht, bzw umgekehrt. dann kannst auch mit variablen variabler-groesse arbeiten.

    Meep Meep



  • Oder Du guckst mal auf meiner Seite ... 😉



  • hmm, danke für die antworten...aber geht das so nicht?

    using namespace std;
    struct Auto {
    String Marke;
    String Typ;
    Integer PS;
    };
    Auto s_auto;
    ofstream out("Autos.dat");
    
    s_auto.Marke = "Marke";
    s_auto.Typ = "Typ";
    s_auto.PS = 360;
        if (out.is_open())
        {
            out.write((const char*)&s_auto, sizeof(s_auto));
        }
    

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • @AndreasW
    ich habe jetzt mal deinen Code probiert, sieht auch so aus obs funktioniert... 🙂
    erm...aber...damit ich weiß ob ich den stream mit fmCreate erstelle oder mit fmOpenWrite muss ich ja wissen ob die Datei schon existiert...also hab ich sowas gemacht

    if (!FileExists("Buttons.dat"))
     {TFileStream* streamout = new TFileStream("Buttons.dat",fmCreate);}
    else
     {TFileStream* streamout = new TFileStream("Buttons.dat",fmOpenWrite);}
    

    aber dann kommt ne Fehlermeldung wie "undefiniertes symbol 'streamout'"...also wie macht man sowas normalerweise ?

    danke im voraus
    Johannes



  • Na komm, das sind nun aber absolute Grundlagen! 😉

    int x;
    if (true) 
     x = 1; 
    else 
     x = 0;
    


  • hallo Johannes2002

    nein so funktioniert das nicht.
    String arbeitet mit pointern, und in deinem fall wuerde er nur die adresse des strings speichern, wo der im speicher liegt.

    wenn dann mußt du es so machen, wie es AndreasW oben mit den Char´s gezeigt hat. String is aehnlich als wenn du mit char* arbeiten wuerdest. da steht nur die adresse drinnen. deshalb mußt du char verwenden. wenn du unbedingt
    String verwenden willst, solltest es villeicht auf meine schon beschriebene art machen. is aber nicht ganz so einfach.

    Meep Meep



  • Wenn alle Stricke reißen könntest Du auch anstatt ner struct eine class verwenden und darin dann ein Lade- und Speicherfunktionen implementieren die u.U. Element für Elemnt in eine Datei pinselt bzw. ausliest.



  • aha...hmmm 🙂
    naja, ich hab erst vor ein paar tagen mit c++ angefangen, vorher hab ich ein wenig delphi programmiert...deshalb hab ich noch nicht so den durchblick...ich sollte wohl wirklich erstmal paar bücher durchmachen 🙂
    ich hab noch das Buch "C programmieren von Anfang an" da, das kann ich ich ja für den Anfang auf jeden fall gebrauchen, oder ? oder wäre es besser gleich mit einem c++ buch anzufangen ?



  • @ peter

    warum soll er unbedingt von der dtruct auf die class wechseln ?
    methoden und das ganze zeugs kann er ja in structs genauso machen.

    Meep Meep


Anmelden zum Antworten