Datensätze aus Textdatei lesen -> verkettete Liste
-
Aber ich muss doch in der Klasse ClBibdaten ein weiteres Objekt der Klasse definieren, oder?
Zurzeit sieht meine Klasse so aus:
class ClBibdaten { public: ClBibdaten(); char* printvar1() { return var1; } char* printvar2() { return var2; } char* printvar3() { return var3; } . . . char* printvarX() { return varX; } void holeDaten (ifstream &datei); int find(char *s1, char *s2); void druckeKomplett(void); void löscheKomplett(void); ClBibdaten *weiteres; private: char *var1; char *var2; char *var3; . . . char *varX; };ClBibdaten *weiteres muss doch da sein um überhaupt verkettete Listen zu ermöglichen, oder?
-
Achso:
Und wenn dannd er 2. Datensatz ausgelesen wird ist var1 ja schon mit irgend nem Inhalt belegt und nicht mehr = NULL.
Daraufhin soll das Programm dann ein neues Objekt (*weiteres) anlegen und immer so weiter... So dass ich hinterher eine Liste von Objekten habe die alle Datensätze aus der ausgelesenen Datei beinhalten.Hoffe es ist einigermaßen klar was ich meine

-
Stopp!!!
private:
char *var1; char *var2; char *var3; . . . char *varX;Sowas willst du sicherlich nicht

Ich dachte an etwas wie:
class Eintrag{ }; class ListenElement{ private: ListenElement* next; Eintrag* value; }; class Liste{ public: void insert(Eintrag* entry){} private: ListenElement* first; ListenElement* last; };
-
Hmm, ich kann deiner Lösung leider nicht wirklich folgen...
Im Prinzip will ich schon sowas wie oben.Denn ein Datensatz aus der Datei kann bis zu 13 verschiedene Einträge/Daten haben die alle einzeln in einem Objekt gespeichert werden müssen.
Also ein Objekt hat immer mindestens 3 dieser Daten und maximal alle 13. Die ausgelesenen Daten müssen dann später in einer bestimmten Reihenfolge wieder in die neue Datei geschrieben werden. Deshalb ist es auch wichtig das sie alle einzeln gespeichert werden.In der Ausgangsdatei steht zB folgender Datensatz:
Name: Klaus Müller
Geb: 20.11.1980
Adresse: Feldweg 1
Stadt: Landsberg
Beruf: Kaufmannin der neuen Datei soll das dann aber zB so aussehen (auch wenns grade unlogisch wirkt, soll nur veranschaulichen was ich will):
D00: Kaufmann
D01: Feldweg 1
D02: 20.11.1980
D03: Landsberg
D04: Klaus Müller
-
Also die verkettete Liste sollte die einzelnen Datensätze enthalten...
Die Klasse Element dann die 3-13 Daten eines Datensatzes.Deine vielen Variablen sahen nur etwas verwirrend aus und ich dachte
du machst Mist...
Wenn du viele durchnummerierte Variablen des gleichen Typs hast, sollte man sie
durch ein Array oder vector ersetzen.Gruß,
XSpille
-
Ah okay. Du würdest also nich alles in eine Klasse packen, sondern verschiedene anlegen?
Wegen den Arrays: Jede Variable kann nur ein Mal pro Datensatz vorkommen. Daher brauch ich eigentlich keien Arrays...
Aber mein Hauptproblem war ja eigentlich, dass ich gar nicht wirklich weiß wie ich die verkettete Liste implementiere? (siehe Ausgangspost)
-
Alex Gir schrieb:
Aber mein Hauptproblem war ja eigentlich, dass ich gar nicht wirklich weiß wie ich die verkettete Liste implementiere? (siehe Ausgangspost)
Dann schau dir nochmal mein 1. Posting ('grafische' Visualisiserung - hier siehst
du wie di Klassen miteinander verknüpft sind) und mein 2. Posting
(Klassengrundgerüst) an.Ich möchte jetzt aber auch nicht zuviel sagen, sonst lernst du nichts mehr

-
Ich steige da wirklich nicht durch

Ich kenne das mit den verketteten Listen nur so, dass man innerhalb der Klasse deren Objekte man quais miteinander verketten will noch ein Objekt der gleichen Klasse anlegt. Du machst das ja irgendwie komplett anders.
-
XSpille schrieb:
Stopp!!!
private:
char *var1; char *var2; char *var3; . . . char *varX;Sowas willst du sicherlich nicht

Ich dachte an etwas wie:
class Eintrag{ }; class ListenElement{ private: ListenElement* next; Eintrag* value; }; class Liste{ public: void insert(Eintrag* entry){} private: ListenElement* first; ListenElement* last; };Okay, nach einigen Stunden Lektüre steige ich jetzt etwas mehr durch

Kann ich denn die Methode zur "Befüllung" der Variablen so lassen wie sie ist, außer das ich an ner bestimmten stelle sage "void insert(Eintrag* entry){}" ?
-
Hmm

-
Alex Gir schrieb:
Hmm

Das sollte vermutlich heissen: Warum antwortet keiner mehr?

Gründe dafür könnten sein:- Dir fehlen ganz offensichtlich absolute Grundkenntnisse
- Du möchtest trotzdem eine verkettete Liste selber implementieren
- Du scheinst selber nicht genau zu wissen, was du eigentlich machen möchtest
Warum benutzt du nicht einfach einen Container der STL?
Du hast in ClBibdaten 13 Variablen vom Typ char* und 13 Methoden printvarX.
Ein Datensatz besteht also scheinbar aus 13 zeichenketten-literalen.
Einfacher wäre es also wiederum einen Container der STL zu benutzen der strings aufnimmt oder? Beispielsweise einen vector, und über den Index kannst du dann auf die einzelnen Daten des Datensatzes zugreifen.Gut - ein Datensatz würde nun also durch ein Objekt des Typs ClBibdaten reprässentiert, und dieses enthält einen vector der die einzelnen Daten hält.
Dann nimmst du dir noch eine std::list<ClBibdaten> und packst alles da rein - und fertig ist die Liste.