Programm schmiert ab



  • Hi,

    ich hab ne datei in die ich 2 Klassen schreibe und später wieder lade.

    Nun, das laden klappt auch so ca. nur das Programm schmiert am ende ab!

    // I N C L U D E S //////////////////////////////////////////////////////////////////
    #include <fstream>
    #include <iostream>
    #include <string>
    
    // D E F I N I T I O N E N //////////////////////////////////////////////////////////
    using namespace std;
    
    // S T R U K T U R E N //////////////////////////////////////////////////////////////
    class CMapHeader
    {
    public:
        string	name;
    	string	adress;
    };
    
    class CMap
    {
    public:
        string	x;
    	string	y;
    };
    
    // F U N K T I O N E N //////////////////////////////////////////////////////////////
    int main (void)
    {
    	fstream File;	
    
    	// --------------------------------------------------------
    	// S C H R E I B E N 
    	// --------------------------------------------------------
    	CMap TestMapOut;
    	CMapHeader TestOut;
    
    	File.open ("Test.txt", ios::out|ios::binary);
    
    	TestOut.name = "Patrick Ullmann";
    	TestOut.adress = "Sag ich Dir net :-D";
    	File.write((const char*)&TestOut , sizeof(TestOut));
    
    	TestMapOut.x = "So auf 50";
    	TestMapOut.y = "So auf 60 halt";
    	File.write((const char*)&TestMapOut , sizeof(TestMapOut));
    
    	File.close ();
    
    	// --------------------------------------------------------
    	// L E S E N 
    	// --------------------------------------------------------
    
    	CMap TestMapIn;
    	CMapHeader TestIn;
    
    	File.open ("Test.txt", ios::in|ios::binary);
    
    	File.read((char*)&TestIn, sizeof(CMapHeader));
    	cout << TestIn.name << endl << TestIn.adress << endl;
    
    	File.read((char*)&TestMapIn, sizeof(CMap));
    	cout << TestMapIn.x << endl << TestMapIn.y << endl;
    
    	File.close ();
    
    	int i;
    	cin >> i;
    
    	return 0;
    }
    

    Ist doch richtig so oder habe ich evtl. doch versehentlich einen Fehler reingehauen von dem ich nix weis? 😕

    H E L P ! ! ! !

    Schon mal Danke im Voraus!



  • Patrick schrieb:

    Nun, das laden klappt auch so ca. nur das Programm schmiert am ende ab!

    Klar:

    File.write((const char*)&TestOut , sizeof(TestOut));
    

    Wie kommst du darauf, dass man eine Struktur, die std::string enthält, so einfach schreiben kann? Was du da effektiv machst, ist, das Objekt TestOut durch die Bytes, aus denen es besteht, zu definieren. Das geht nur mit POD-Objekten (POD = Plain Old Data), d.h. mit primitiven Typen und Strukturen, die selbst nur POD-Objekte enthalten, grob gesagt, alles was es in C gibt. Klassen mit Konstruktoren, Destruktoren, virtuellen Funktionen und allem Pipapo sind nicht POD. std::string damit auch nicht.

    Ich würde ein paar Funktionen wie diese verwenden:

    void write_string(ostream& out, string const& s) {
      string::size_type len = s.length();
      out.write(reinterpret_cast<char*>(&len), sizeof len);
      out.write(s.data(), len);
    }
    
    string read_string(istream& in) {
      string::size_type len;
      in.read(reinterpret_cast<char*>(&len), sizeof len);
      char *temp = new char[len];
      in.read(temp, len);
      string result(temp, len);
      delete[] temp;
      return result; // hier gibts wahrscheinlich was exceptionsicheres, aber darauf hab ich grad keine Lust
    }
    

    Ich hoffe das ist so richtig, ich habs nicht getestet ...



  • hi,

    danke bin auf char-Arrays umgestiegen 🙂 Funzt prima. big thx!



  • Wieso danke? Ich hab dir nicht zu char-Arrays geraten.



  • :p :p



  • @Bashar:
    Indirekt 🙂 als du POD erwähnt hattest 🙂


Anmelden zum Antworten