Zum Inhalt springen

Atrribute mit dynamischer Länge speichern


voelki

Empfohlene Beiträge

Hi,

wie kann ich Attribute einer Klasse dynamisch in eine Datei speichern??

Z.B. enthält die Klasse einen dynamischen Vektor, man weiss also vorher nicht wieviele Werte dort drinstehen.

Vieleicht weiss ja jemand was...ich bin kurz vorm verzweifeln, hattes mit Semikolon und endl als Trennzeichen versucht, nach einer Woche hab ichs jetzt aufgegeben...;((

mfg

Völki

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich das richtig verstanden habe dann müsste das mit endl als Trennzeichen doch gut funktionieren. Einfach beim Speichern die Werte nacheinander in die Datei schreiben. Beispiel:


//Datei save.txt

1. Eintrag

2. Eintrag

3. Eintrag

Falls noch statische Attribute vorhanden sind sollten dies vor den dynamischen in die Datei geschrieben werden. Zum Laden erst die vielleicht vorhanden statischen Attribute lesen und danach solange die Datei nicht am Ende ist, die dynamischen Attribute lesen. (while !cin.eof()) Codebeispiel:

#include <fstream.h>

class Vektor;

// speichern 

void speichern (const Vektor v, char* datei)

{

   fstream file (datei, ios:  :out);

   v.GotoFirstElement();

   Vektorelement tmp;

   while ( ! v.IsNotAtEnd() )

   {

      tmp = v.GetElement();

      file<<tmp<<endl;

      v.GotoNextElement();

   }

}

// laden

void laden (Vektor *v, char* datei)

{

   fstream file (datei, ios::in);

   Vektorelement tmp;

   while ( !file.eof() )

   {

      file>>tmp;

      v->Insert (tmp);

   }

}

[ 08. Juni 2001: Beitrag editiert von: maddin ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja, ich habe halt 4 Attribute mit Dynamischer Länge und einen Vektor mit Beliebig vielen Einträgen...

Das Problem dabei ist dann nur das löschen/ändern, irgendwie weiss ich dann nie wo ich löschen muss. Vor allem die Datei wird ja nicht zeilenweise bearbeitet, d.h. ich kann eine zeile nicht einfach verkürzen, oder verlängern...;(

Also so hatte ich das bis jetzt:

1;Attribut1;Attribut2;Attribut3; //endl

0;63; //Werte des Vektors

Wenn ich jetzt einen Datensatz ändern will

(1;Attribut....//hier drüber) und der neue Datensatz is länger, dann haue ich voll in den zweiten Datensatz...

mfg

Völki

Link zu diesem Kommentar
Auf anderen Seiten teilen

Arbeite doch mit 2 Dateien. Mach die erste so wie gehabt und laß einfach die Attribute Offset-Werte in Datei 2 sein. Ändert sich dann ein Attribut wird nur hinten rangehängt und der Offset darauf gesetzt.

Wenn jetzt noch ein Kennzeichen als Löschkennzeichen auf das alte Attribut gesetzt wird, mußte man halt gelegentlich eine Garbage Collection durchführen und den Müll rausschmeißen.

Aber dafür geht´s hurtig wenn sich was ändert! Mit Zeigern zu arbeiten ist bei dynamischen Werten immer von Vorteil.

Man könnte das ganze auch mit einer Linked-List (single oder double-ended) genausogut realisieren.

Wenn man wollte könnte man Änderungen in freigegebenen Dateibereichen reinschreiben - am besten mit der richtigen Größe falls vorhanden, damit alles möglichst optimal ausgenutzt wird. Aber trotzdem wird hier auch eine GB irgendwann benötigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, das sagt mir auchnicht viel mehr...hm, verkettete Liste da bin ich ganz fit, die komplett speichern, oder wie??

Oder könnte man das auch einfach mit anderen stl container machen und die einfach komplett in die Datei schreiben...??

mfg

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klar könnte man das mit CObjects - die kann man Serializen. Einfach alle Datentypen von CObject ableiten und in eine CList reinsetzen. Aber jeder hier im Chat meckert an mir rum wie speicherfressend und langsam doch C++ und STL wäre. Doch auch hier mußt Du bei jedem Zugriff die Datei kopieren weil sich die Daten genauso überschneiden könnten. STL unterstützt solche pfiffigen Dateioptionen meines Wissens nicht. Ich denke die Geschichte mit den Offsets und dem statischen Teil in einer Datei und der dynamische Teil in einer zweiten Datei wäre die einfachste Lösung (hört sich nur so kompliziert an).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original erstellt von Crush1:

<STRONG>Aber jeder hier im Chat meckert an mir rum wie speicherfressend und langsam doch C++ und STL wäre.

...

STL unterstützt solche pfiffigen Dateioptionen meines Wissens nicht. </STRONG>

Hm, also gemeckert wurde eigentlich nicht ueber Speicher- und Geschwindigkeitsbedarf der STL, sondern ueber die Anwendung derselben um jeden Preis; und jetzt gerade hast Du selbst drueber gemeckert. ;)

Warum nicht einfach den kompletten Datenbestand nach der Aenderung neu abspeichern? Ansonsten gibt es wahrscheinlich dutzende Methoden, alle mit individuellen Vor- und Nachteilen, so dass man die beste nur mit naeheren Informationen festlegen kann.

Uli

[ 09. Juni 2001: Beitrag editiert von: EisenUli ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

die einfachste möglichkeit wäre es sicherlich den gesammten datenbestand am anfang des programms zu laden und am ende des programms zu speichern.

ansonsten könnte man ja statt einer datei auch gleich eine datenbank nehmen. (CRecordset). wenn das möglich wäre, wurde ich sie sehr wahrscheinlich bevorzugen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...