dynamische Variablen in Datei schreiben



  • Hi,
    ich habe eine Struktur, die einige dynamische Objekte, z.B. einen String
    speichert.
    Bsp:

    struct MyStruct
    {
       char* mystring;
    };
    

    und dann wird halt später eine Instanz dieser Klasse erstellt und
    MyStruct::mystring einen Wert zugewiesen. Ich möchte jetzt diese Struktur
    binär in einer Datei speichern und das funktioniert nicht. Denke dass es
    nicht klappt, da mystring ja nur den Pointer auf das erste Element speichert
    und der Inhalt im Speicher liegt und somit nur der Pointer geschrieben wird
    während der Speicher nach Ablauf des Programms gelöscht wird. Somit kann
    ich beim Lesen nicht auf den String zugreifen...
    Nur - wie kann ich dann am besten anders dynamisch einen String in der
    Struktur speichern, den ich dann passend schreiben kann?
    Das gleiche Problem hab ich mit "string" und "CString" auch (basieren ja
    auf char*)



  • Ich verstehe dein Problem nicht so wirklich. Willst du den Wert von z.B. mystring in eine Datei schreiben und später (beim nächsten Programmstart) wieder auslesen? Das ist doch kein Problem. (Aber ich glaube, das war nicht deine Frage, oder?)

    Caipi



  • doch das war die Frage. Hab halt diese Struktur die ich binär in eine Datei schreibe. Wenn ich die später wieder auslese, enthält mystring nicht den Inhalt den ich reingeschrieben hab sondern nur wirres Zeugs.



  • Meinst du das etwa so:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    struct myStruct
    {
            std::string str;
    };
    
    int main(int argc, char* argv[])
    {
            if(argc == 2)
            {
                    myStruct foo;
                    myStruct bar;
                    foo.str = "Hallo Welt!";
    
                    ofstream out(argv[1], ios::binary);
                    ifstream in(argv[1], ios::binary);
                    out << foo.str << endl;
                    if(in.is_open())
                            getline(in, bar.str);
    
                    cout << "\n bar.str: " << bar.str << endl;
            }
            return 0;
    }
    

    Das Funktioniert doch, oder?

    Caipi



  • #include <fstream>
    #include <iostream>
    
    struct MyStruct
    {
       char* my_string;
    }; 
    
    void read(); void write();
    
    int main()
    {
    	write(); read(); 
    }
    
    void write()
    {
      MyStruct bla;
      bla.my_string = new char[20];
      strncpy(bla.my_string , "Hello World!", 20);
    
      std::cout << my_string << std::endl;
    
      unsigned string_size = strlen(my_string);
    
      std::ofstream of("afile.dat",std::ios::binary);
    
      of.write(reinterpret_cast<char*>(&string_size),sizeof(unsigned));
      of.write(my_string,string_size);
      of.close();
    
      delete[] my_string;
    }
    
    void read()
    {
      MyStruct foobar;
      std::ifstream ifs("afile.dat",std::ios::binary);
    
      unsigned size_of_string = 0;
    
      ifs.read(reinterpret_cast<char*>(&size_of_string),sizeof(unsigned));
    
      foobar.my_string = new char[size_of_string+1];
    
      ifs.read(foobar.my_string, size_of_string);
    
      std::cout << foobar.my_string << std::endl;
      ifs.close();
      delete[] foobar.my_string;
    }
    

    // Edit: Die files sind aber dann nicht portabel. ( Big Endian <=> Little Endian )



  • danke, das funktioniert. schätze es war simpel, da muss irgendein Fehler
    gelegen haben.


Anmelden zum Antworten