Objekte in Dateien speichern

Theranium

Mitglied
Hi Leute,

ich habe da mal ne Frage: wie kann ich Objekte mit der einen Funktion in einer Binärdatei speichern, und diese mit einer zweiten Funktion wieder auslesen? Beide Funktionen gehören derselben Klasse an. Erst, als ich beide Funktionen in eine F. umschrieb, klappte das.

Die Sache ist nähmlich die: ich habe ein Menü und möchte über die eine Option neue Objekte hinzufügen; über die andere Funktion möchte ich mir eine Sammlung der bisher erstellten Objekte anzeigen lassen.
 
Dem möchte ich noch folgendes hinzufügen:

Objekte sollten ihre Daten selbst serialisieren/deserialisieren können.
Spendiere doch den betroffenen Klassen je eine (De)Serialisierungsmethode und rufe dann die Methode zum betreffenden Objekt auf.
Es werden ja prinzipiell immer nur die Daten eines Objektes gespeichert, nicht das Objekt selbst - also sollte die (De)Serialisierungsmethode am besten können. ;)

Nur als Denkanstoss...
Gruß René
 
Hi, danke erst mal für die schnelle Antwort,

hier der Code für die Funktion zum Hinzufügen:

int C_Server::Add()
{
cout << " >> Server hinzufuegen" <<endl <<endl;

cout << " Wie viele Server sollen aufgenommen werden?\n >> ";
cin >> m_Add;

ofstream Out ("AddServer.ads", ios::binary);
if (Out == NULL)
{
cout << " Datei \"AddServer.ads\" konnte nicht geoeffnet werden!" <<endl <<endl
<< " Bitte warten...\n";
return 3;
}

Out.write ((char*) &m_Add, sizeof (m_Add));
Out.close();

C_Server *Temp = NULL;
for (int j=0; j<m_Add; j++)
{
Temp = new C_Server [j+1];
system("cls");
cout << " >> Server hinzufuegen" <<endl <<endl <<endl;
cout <<endl <<" Server " << j+1;
cout <<endl <<" Geben Sie den Namen eines Servers ein\n >> ";
cin.ignore();
cin.get(m_Name,29);
cout <<endl <<endl <<" Geben Sie die IP des Servers ein\n >> ";
cin.ignore();
cin.get(m_IP,20);

m_Ping = "0";

// open file to write
ofstream Output ("ListServer.lsr", ios::binary);

if (Output == NULL)
{
cout << "Datei konnte nicht geoeffnet werden." << endl;
return 3;
}

// write instance in file
Output.write ((char *) &Temp, sizeof (Temp));
Output.close ();

Calculator();

cout << " Server " << j+1 <<endl;
showData();

cout << endl <<" ...Server wurde gespeichert." <<endl <<endl;
}// for ;

system("pause");
system("cls");
}//Add


Die Funktion Calculator() speichert übrigens die Anzahl der Rechner in einer Datei.
 
...Und hier die Funktion zum Lesen der Objektdatei:


//showData
int C_Server::showData()
{

// open file to read
ifstream Input ("ListServer.lsr", ios::binary);
if (Input == NULL)
{
cout << "Datei \"ListServer.lsr\" konnte nicht geoeffnet werden." << endl;
return 3;
}

// read instance
C_Server Tmp;
Input.read ((char *) &Tmp, sizeof (Tmp));

cout << " Server: " << m_Name <<endl
<< " IP : " << m_IP << endl
<< " Ping : " << m_Ping << endl <<endl;
}//showData


Mein Problem war bisher, dass ich nur ein Objekt lesen konnte, und auch nur dann wenn vorher eben dieses hinzugefügt worden ist.

Ist es vielleicht möglich, dass nur ein Objekt in eine Datei gespeichert werden kann?
 
Hi.

Man kann komplexe Objekte nicht einfach so mit write in eine Datei schreiben und dann mit read auslesen. Mach es so wie CodeFlatter vorgeschlagen hat und finde eine geeignete Serialisierung der Daten des Objekts.

Gruß

PS: Und bitte verwende die Code-Tags! Dein Code ist sonst ziemlich unleserlich.
 
Dazu kann man in einen Stream im "Anhängen"-Modus (append) schreiben oder man bewegt den Dateizeiger jeweils vor dem schreiben ans Ende der Datei (seek).
Aber: die Datei muss so geöffnet werden, dass sie nicht automatisch auf 0 verkürzt wird.
Versuch mal Dein Glück ;)

Gruß René
 
Das mit der Serialisierung ist wirklich eine gute Idee, diese Methode kannte ich noch gar nicht. Ich weis gar nicht, wie ich das umsetzen kann. Ich hab mal etwas gegooglet und ein paar interessante Seiten gefunden, könntet ihr mir mal irgendwie eine starthilfe geben? Vielleicht ne Seite posten oder so?
 
Vielleicht sollte ich noch darauf hinweisen, dass ich dev C++ nutze. Ich habe bisher nur Seiten mit .NET und VC++ gefunden, wisst ihr, ob dass auch mit dev, sprich Konsole funktioniert?
 
Hi.

Serialisierung ist ein Konzept welches überall funktioniert - unabhängig von Programmiersprache und Framework.

Du mußt dir einfach eine geeignete Repräsentation deiner Daten überlegen, so dass du diese nachher auch wieder aus der Datei auslesen kannst um das Objekt wiederherzustellen.

Du könntest z.B. die Attribute deiner Klasse durch Zeilenumbrüche getrennt als Name-Werte Paare in eine Text-Datei speichern und mehrere Objekte voneinander durch 2 Zeilenumbrüche trennen. Das wäre bspw. eine ganz simple Methode.

Es gibt natürlich auch fertige Bibliotheken die du verwenden könntest. Z.B. http://www.boost.org/libs/serialization/doc/index.html

Gruß
 
Zurück