Daten binär speichern
-
Hallo,
ich bin immernoch dabei mir zu überlegen wie ich das am besten mit den vielen daten löse.
Nun hab ich ( NUR AUS NEUGIER !! ) versucht eine Datei binär zu speichern, das geht ja ganz gut, aber wie speichere ich in einer binären Datei Daten wie z.B.eine klasse Person ?Also nehmen wir an ich habe ein Programm welches eine Art Personendatenbank sein soll.Ich habe also eine Classe Personen mit dem Vornamen, Nachnamen und dem Alter meinetwegen.
ref class Personen { private: String^ m_vorname String^ m_nachname; int m_alter; public: Personen(String^ Vorname, String^ Nachname, int Alter) : m_vorname(Vorname), m_nachname(Nachname), m_alter(Alter) {} };
Hab ich jetzt aus dem Kopf geschrieben, nicht getestet. Soll ja nur ein Bsp. sein.
Im Programm soll mal nach einer bestimten Anzahl von Personen gefragt werden und dieses sollen dann in eine binäre Datei geschieben werden.
Ist diese Datei schon vorhanden soll sie eingelesen werden und alle darin enthaltenen Personen ausgegeben werden.BinaryWriter zum schreiben, BinaryReader zum lesen und FileStream für die Datei selber, soweit bin ich gekommen. Was ich nicht weiß ist wie genau ich Personen speichere ? Das müsste ja dann eine Liste oder ein Array oder so was sein oder wie macht man das ?
Matthias
-
Hallo,
ich hab mal weitergeforscht und glaube ich habe einen Weg gefunden.
Weiß nur nicht ob alles so richtig ist. Funktioniert aber !! *freu*Hab das ganze natürlich an einem Beispiel probiert :
// BinärLesenSchreiben.cpp: Hauptprojektdatei. #include "stdafx.h" using namespace System; using namespace System::IO; using namespace System::Runtime::Serialization; using namespace System::Runtime::Serialization::Formatters::Binary; #define DATFILE "Personen.dat" [System::SerializableAttribute] ref class Person { public: String^ m_vorname; String^ m_nachname; int m_alter; // Konstruktor Person(String^ Vorname, String^ Nachname, int Alter) :m_vorname(Vorname), m_nachname(Nachname), m_alter(Alter){}; }; void PersonenSchreiben() { if(File::Exists(DATFILE)) File::Delete(DATFILE); System::Collections::ArrayList^ PersonenListe = gcnew System::Collections::ArrayList; PersonenListe->Add(gcnew Person("Vorname 1", "Nachname 1", 20)); PersonenListe->Add(gcnew Person("Vorname 2", "Nachname 2", 21)); PersonenListe->Add(gcnew Person("Vorname 3", "Nachname 3", 22)); Console::WriteLine("Schreibe PersonenListe {0} Einträge", PersonenListe->Count); BinaryFormatter^ formatter = gcnew BinaryFormatter; FileStream^ fs = gcnew FileStream(DATFILE, FileMode::Create, FileAccess::Write); formatter->Serialize(fs, PersonenListe); fs->Close(); } void PersonenLesen() { System::Collections::ArrayList^ PersonenListe = gcnew System::Collections::ArrayList; BinaryFormatter^ formatter = gcnew BinaryFormatter; FileStream^ fs = gcnew FileStream(DATFILE, FileMode::Open, FileAccess::Read); PersonenListe = dynamic_cast<System::Collections::ArrayList^>(formatter->Deserialize(fs)); fs->Close(); Console::WriteLine("Lese PersonenListe {0} Einträge", PersonenListe->Count); for each(Person^ p in PersonenListe) Console::WriteLine(p->m_vorname+" "+p->m_nachname+" "+p->m_alter); } int main(array<System::String ^> ^args) { PersonenSchreiben(); PersonenLesen(); Console::Write(L"Ready"); Console::ReadKey(); return 0; }
Stimmt das so ?
Fnktionieren tut es ja. Man kann das auch testen indem man
PersonenSchreiben nach dem ersten lauf mal auskommentiert.
So sieht man das auch nur gelesen werden kann.Was sagt Ihr dazu ?
Matthias
-
Es wird immer Wege geben wie man das Problem anderst oder eleganter Lösen kann. In einem Lernprozess erreicht man Ergebnisse die man später garnicht mehr ansehen möchte, weil das Wissen sich erweitert.
Vom reinen Lernprozess wäre es wesentlich fördernder, wenn Du die Lösung akzeptierst und mit späteren Wissen selbst noch einmal Analysierst.
Es gibt viele Stellen auf die man eingehen könnte / müsste , was aber den Rahmen sprengen würde.
Beispiel:
PersonenListe = dynamic_cast<System::Collections::ArrayList^>(formatter->Deserialize(fs)); fs->Close(); Console::WriteLine("Lese PersonenListe {0} Einträge", PersonenListe->Count);
Abgesehen davon, das es neulich erst Hinweise zur Arraylist und derer Nachteile gab (BinaryFormatter ist meinerseits jetzt ungeprüft), solltest Du an dieser Stelle einen safe_cast einsetzen oder auf Nullpointer reagieren.
Solche Hinweise sind hier jetzt zwar ok aber den wirklichen Lern und Aha Effekt hast Du, wenn Du alleine darüber stolperst (wenn z.B. mal an der Stelle ein nullptr vorhanden ist und deswegen das Programm den Dienst verweigert).
-
Hallo,
alles klar, das werd ich dann mal so machen.
Bin erst mal froh so weit gekommen zu sein.
Matthias