struct speichern



  • hallo,

    wie kann ich am Besten folgendes struct in einer Datei speichern?

    struct foo {
     int     i1;
     string  str1;
     string  str2;
     bool    b1;
    }
    

    Ich habe versucht das ganze zu speichern. Alle Werte bis auf die Stringwerte werden richtig gespeichert und wieder geöffnet.
    Ich denke, die Strings werden nicht richtig erkannt, da die Länge nicht vorgegeben ist und damit keine Typisierung möglich ist.
    wenn ich allerdings versuche eine Länge vorzugeben, z.B. folgendermaßen:

    struct foo {
     int     i1;
     char*   str1[63];
     char*   str2[63];
     bool    b1;
    }
    

    dann bekomme ich Fehlermeldungen bei der Zuweisung der Stringwerte.

    [C++ Fehler] uMain.cpp(56): E2277 L-Wert erwartet
    

    die zuweisung sieht dabei folgendermaßen aus:

    string bla = "hallo";
    foo.str1 = bla;
    

    Was kann ich nun also machen, damit entweder die Zuweisung funktioniert oder ich den String so speichern kann?



  • Das Problem ist, dass string eine komplexe Klasse ist. Da wird zwar schon was gespeichert, aber das muss nicht unbedingt richtig sein.

    Das Einzige was du in dem Fall tun kannst, ist diesen Struct händisch zu speichern...



  • Hallo

    C-Strings mit fester Länge werden so definiert (sozusagen als Array)

    char   str1[63];
    

    bis bald
    akari



  • struct foo Teststruktur;  //Strukturvariable deklarieren
      FILE *fp;
      if(SaveDialog1->Execute())
      {
        fp = fopen(SaveDialog1->FileName.c_str(), "wb");
        if(fp == NULL)
        {
          Application->MessageBox("Datei nicht geöffnet!", "Fehler", MB_OK);
        }
        else
        {
          fwrite(Teststruktur, sizeof (foo), 1, fp);
          fclose(fp);
        }
      }
    

    So müsste es gehen!
    mfg rzwodzwo



  • Danke für das Beispiel und auch die restlichen Antworten.
    Zum Beispiel: So habe ich es eigentlich auch gelöst. Mein Problem sind halt die Strings in dem struct, durch die eine genaue Größe des structs nicht berechnet werden kann.
    Mein Frage müsste daher eher lauten:

    Wie weise ich einem chararray einen stringwert zu?

    Wie gesagt bei folgendem bekomme den Fehler E2277

    char* chr[63] = NULL;
    string str = "foo";
    
    chr = str;
    
    ---->>>[C++ Fehler] uMain.cpp(56): E2277 L-Wert erwartet
    

    Wenn ich den String in das chararray bekomme, dann ist mein Problem gelöst 🙂



  • strncpy ist dein Freund.

    -junix



  • bin gerade erst mit c++ angefangen und hab vorher nur ansi-c gemacht.

    wenn ich strncpy nutze, muss ich dann in c++ auch den speicher reservieren oder wird das vom compiler erledigt?



  • Achda fällt mir auf: Lies nochmals akaris Posting.

    Wenn du früher C gemacht hast, dann weisst du ja, dass char foo[65]; platz für 64 Zeichen + 0 Abschluss auf dem Stack reserviert, den du dann mit memset(foo, 0, 65) noch initialisieren solltest.

    -junix



  • höchstwahrscheinlich stelle ich mich nur zu blöd an, aber das mit dem strncpy() bekomme ich nicht ganz hin.
    Ich habe nun folgendes probiert

    char chr[64];
    string str = "Hallo Welt";
    
    strncpy(chr,str,64);
    
    ------->>>>>>>>[C++ Fehler] uDataField.cpp(78): E2034 Konvertierung von 'string' nach 'const char *' nicht möglich
    

    Dabei kommt halt die angegebene Fehlermeldung. Was mache ich denn falsch?



  • Was für einen Parameter erwartet strncpy denn?
    Kannst du asu der kojmplexen Klasse "string" diesen Datentypen irgendwie extrahieren?

    Ausserdem überschreibst du mit deinem Code gegebenenfalls das abschliessende 0 des Puffers... und initialisiert hast du ihn auch nicht...

    -junix


Anmelden zum Antworten