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