Daten aus txt datei in Klasse einlesen
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Ich habe eine Textdatei und will Daten in eine Klasse einlesen. Die Grobe Struktur wäre:
Nummer
Name
Nummer
Nummern
Nummern@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Die Beispieldatei sähe so aus:
Na wie jetzt? Wie ist ein Record genau aufgebaut?
Und müssen die Anführungszeichen wirklich sein? Das macht das ganze bloß unnötig komplifiziert.
-
@Swordfish Mit einer passenden Definition von
Nummern
stimmt das eh mit dem Beispiel überein
(Aber klar, wenn man mitNummern
meint dass da"1" "2" "42"
drin steht, dann sollte man das dazuschreiben.)
-
Sorry, da habt ihr recht. ich nehme die " " raus, dann wird´s wohl einfacher.
Leider muss ich ehrlich gesagt zugeben, dass ich durch die Codes nicht ganz durchblicke.
Ich habe auch nicht den Anspruch, dass alles möglichst schön und effizient ist. Gibt es denn irgendwie die Möglichkeit, auf meinem bestehenden Code aufzubauen und das eingelesene in eine Klasse zu packen oder einen Vector (wobei ich dachte, dass ein Vector nur aus Zahlen besteht, berichtigt mich bitte, wenn ich falsch liege)LG
-
@PardiMau
Der Einstiegswiderstand bei der STL ist relativ hoch, da Vieles auf abstrakten Konzepten beruht und als Einsteiger nicht intuitiv zu verstehen ist. Da muss man sich schon Mal ein Buch schnappen und etwas lesen. Sobald man aber Templates und Iteratoren halbwegs verstanden hat ergibt plötzlich alles Sinn.
Einstd::vector
ist ein Klassentemplate, da kann man fast alles reinstecken, nicht nur Zahlen. Man kann ihn auch problemlos in einer Funktion erzeugen und als Rückgabewert zurückgeben. Damit bietet sich das Einlesen in einer eigenen Funktion ja gerade an. Und nicht alles muss als Methode einer Klasse implementiert werden, gerade das Einlesen aus einer Datei würde ich in deinem Fall als freie Funktion implementieren.
Darfst du das Dateiformat frei wählen oder ist es vorgegeben?
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Gibt es denn irgendwie die Möglichkeit, auf meinem bestehenden Code aufzubauen und das eingelesene in eine Klasse zu packen oder einen Vector
Sicherlich.
Als erstes bastelst du dir jetzt mal eine
struct Person
die die Daten aufnehmen soll.
Dann geht's ans Einlesen.Nimm diese Variante die du hattest:
while (true) { for (auto& i : Zeilen) getline(in, i); if (!in) break; // Es konnte keine Datei gefunden werden (sic) cout << setw(20) << "Nummer: " << Zeilen[0] << endl; //cout << setw(20) << "Name: " << Zeilen[1] << endl; cout << setw(20) << "Geburtsjahr: " << Zeilen[2] << endl; cout << setw(20) << "Eltern: " << Zeilen[3] << endl; cout << setw(20) << "Kinder: " << Zeilen[4] << endl; if (i = 5) // (sic) break; //Ende der fünfzeiligen Ausgabe (sic) }
An der Stelle
if (i = 5)
hast du jetzt die 5 Zeilen eines Eintrags inZeilen[0]
...Zeilen[4]
stehen.
Statt demif (i = 5)
machst du dort jetzt erstmal eine Variable vom TypPerson
hin und befüllst deren Felder.
Die "Listen" Felder (Eltern, Kinder) vergisst du erstmal, um die können wir uns später kümmern - immer schön der Reihe nacht.Zur Kontrolle ob das alles funktioniert hat baust du dir dann erstmal eine Ausgabe dazu - also einfach die
Person
Variable die du gerade befüllt hast ausgeben. Pack die Ausgabe am besten in eine eigene Unterfunktion, dann bleibt das übersichtlicher und die Funktion kannst du dann später auch einfach wiederverwenden.Dann nimmst du dir den Teil vor alles in einen
vector<Person>
zu packen. Das ist relativ easy, einfach vor der Schleife eine Variable mit Typvector<Person>
anlegen und in der Schleife die lokale Person Variable in den vector reinstopfen.Dann nimmst du die Ausgabe aus der Einleseschleife raus und machst nach der Einleseschleife eine Ausgabeschleife wo du bloss alles wieder ausgibst was du erst eingelesen hast.
Dann bist du schonmal ein gutes Stück weit gekommen.
Dann kannst du dir aussuchen was du als nächstes angehst: Suche einer bestimmten Person im vector oder erstmal das was wir auf die lange Bank geschoben hatten implementieren (Einlesen der Listen-Felder).
Dazu meldest du dich einfach nochmal hier.
Bzw. auch gerne wenn du bei einem der Schritte davor nicht weiterkommst.
-
-
@manni66 sagte in Daten aus txt datei in Klasse einlesen:
@hustbaer sagte in Daten aus txt datei in Klasse einlesen:
if (i = 5)
ist immer wahr.
if (i == 5)
?Copy Paste Fehler, das war sicherlich zur Überprüfung für PardiMau gedacht.
-
Freunde...
Das war der Code den er gepostet hatte. Mir ist schon klar dass das Quatsch ist. Ihm vermutlich auch, er wurde ja bereits darauf hingewiesen.
Nur da er die verbesserte Variante eben nicht gepostet hat, hab ich eben die alte zitiert.
Hätte es was geholfen wenn ich (sic) dazugeschrieben hätte?ps: Das Kommentar beim
break
danach ist auch Quatsch. Aber genau so wenig von mir.
ps2: Und das Kommentar beimbreak
davor auch. Und auch hier wieder: nicht von mir.
-
Okay, struct person habe ich gebastelt.
@hustbaer sagte in Daten aus txt datei in Klasse einlesen:
Statt dem if (i = 5) machst du dort jetzt erstmal eine Variable vom Typ Person hin und befüllst deren Felder.
was genau meinst du damit? Brauche ich dazu ein Array? Und wenn ich das dann ausgebe, was sollte dann optimalerweise da stehen?
LG
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Okay, struct person habe ich gebastelt.
Und wie sieht die jetzt aus?
@DocShoe sagte in Daten aus txt datei in Klasse einlesen:
Darfst du das Dateiformat frei wählen oder ist es vorgegeben?
= ?
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
was genau meinst du damit? Brauche ich dazu ein Array?
Um eine Person zu lesen brauchst Du noch kein Array (oder
std::vector
).
-
struct Person { string Identifikationsnummer; string Name; string Geburtsjahr; vector<string> Eltern; vector<string> Kinder; }p;
Ich hoffe, dass das so geht. Theoretisch kann doch alles string sein oder? Ich muss ja mit den Zahlen nicht rechnen.
das Dateiformat ist .txt
Ich war verwirrt, weil @hustbaer meinte, ich soll eine Variable vom Typ Person hinmachen und die Felder befüllen.
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
das Dateiformat ist .txt
Daß es sich um Text handelt ist allen Beteiligten klar. Gefragt war danach wie ein Datensatz für eine Person aufgebaut ist und ob das vorgegeben ist oder Du Dir das Format selbst aussuchen kannst.
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Ich war verwirrt, weil @hustbaer meinte, ich soll eine Variable vom Typ Person hinmachen und die Felder befüllen.
Da sollst du immer noch. Versehentlich hast du mit P sogar schon eine Variable. Wie greift man nun auf die Felder eines struct zu? Steht in jedem Buch/Tutorial.
-
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
struct Person
{
string Identifikationsnummer;
string Name;
string Geburtsjahr;
vector<string> Eltern;
vector<string> Kinder;
}p;Sei dir aber bewusst, was du da machst:
struct Person { ... } p
.Ich bin persönlich kein großer Freund davon, die struct und gleich eine Variable auf einmal bekannt zu machen und würde dir auch raten, oben im Programm einmal die
struct Person { ... };
bekanntzumachen und dann unten einenstd::vector<Person> personen;
bzw einePerson p;
zu benutzen.Die Klasse
Person
soll ja auch überall im Programm (global) bekannt sein, während die Variablep
(oder wie auch immer) nur lokal gültig sein sollte.
-
@Swordfish sagte in Daten aus txt datei in Klasse einlesen:
...@DocShoe sagte in Daten aus txt datei in Klasse einlesen:
Darfst du das Dateiformat frei wählen oder ist es vorgegeben?
= ?
Dachte, dass XML oder JSON vllt ne bessere Option sind. Falls sich mal was andern sollte.
-
-
@DocShoe sagte in Daten aus txt datei in Klasse einlesen:
@Swordfish sagte in Daten aus txt datei in Klasse einlesen:
...@DocShoe sagte in Daten aus txt datei in Klasse einlesen:
Darfst du das Dateiformat frei wählen oder ist es vorgegeben?
= ?
Dachte, dass XML oder JSON vllt ne bessere Option sind. Falls sich mal was andern sollte.
Damit wäre der OP gründlich überfordert.
-
Um da eben noch Klarheit zu schaffen, es geht um einen einfachen Editor Text
-
Bevor ich aufgebe noch ein letzter Versuch.
@Swordfish sagte in Daten aus txt datei in Klasse einlesen:
Gefragt war danach wie ein Datensatz für eine Person aufgebaut ist und ob das vorgegeben ist oder Du Dir das Format selbst aussuchen kannst.
Da hast Du schonmal soetwas beschrieben:
@PardiMau sagte in Daten aus txt datei in Klasse einlesen:
Die Beispieldatei sähe so aus:
0001 Franz Müller 1996 "0004" "0005" "0019" "0020" 0002 Helga Richter 1994 "0041" "0042" "0019" "0020" 0003 Sabine Müller 1990 "0004" "0005" "8" "9" 0004 Sandra Müller 1967 "10" "11" "0001" "0003" 0005 Peter Müller 1966 "12" "13" "0001" "0003"
In der ersten Zeile einer Person steht wohl eine ID, in der zweiten der Name, und in dritten das Geburtsjahr. In der vierten Zeile Mutter und Vater? oder Vater und Mutter? Muss das in Anführungszeichen sein? In der fünften Zeile die Kinder? Muss das in Anführungszeichen sein?
-
@Swordfish
nein, die Anführungszeichen müssen nicht sein