Daten aus txt datei in Klasse einlesen



  • 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



  • @PardiMau
    Die führenden Nullen auch nicht?



  • @DocShoe sagte in Daten aus txt datei in Klasse einlesen:

    @PardiMau
    Die führenden Nullen auch nicht?

    Ich glaube, diese Diskussion ist am Ziel vorbei. Das ist irgendeine ID und warum sollte die nicht ein String sein und/oder Tüddelchen haben?

    Spannender ist doch, was eigentlich das Ziel von @PardiMau ist. Soll das dauerhaft im Speicher gehalten werden? Will man nur einmalig was suchen (wie wär's dann mit grep und den Optionen -A und -B oder -C?) Oder sollen vielleicht Familienbäume erzeugt werden?

    Mein wesentlicher Punkt ist jedoch, dass man mit diesen IDs ja sowieso nicht rechnen will. Die können also genausogut Strings mit führenden Nullen sein.



  • @wob
    Ja, möglich. Meine Überlegung war, dass OP mit dem eigentlichen Thema schon Probleme hat und sich durch Sonderfälle in seinem Dateiformat noch unnötige Probleme einhandelt. Es gibt keinen Grund, IDs vierstellig mit führender Null zu speichern.



  • @DocShoe sagte in Daten aus txt datei in Klasse einlesen:

    Es gibt keinen Grund, IDs vierstellig mit führender Null zu speichern.

    Doch, sicher. Wenn das aus irgendeinem anderen System eben genauso rauskommt und man daran einfach mal nichts ändern will. Vielleicht müssen die Ergebnisse später wieder zurückgespielt werden. Woher willst du dann wissen, wie viele Nullen du vorne anhängen musst? Vielleicht lassen sich ja gar nicht alle diese IDs in int wandeln? Schon gehabt, dass ein Kunde in einem Land nur int-IDs hatte und dann die Software auf ein anderes Land erweitert wurde, wo die IDs wilde Zeichenketten waren. Ich würde also respektieren, was ich da vorgesetzt bekomme, sofern nicht irgendwas dagegen spricht.



  • @wob
    Ich habe aus PardiMaus Antwort "die Anführungszeichen müssen nicht sein" geschlossen, dass das Dateiformat nicht fix ist und er es ändern darf.



  • @wob sagte in Daten aus txt datei in Klasse einlesen:

    Spannender ist doch, was eigentlich das Ziel von @PardiMau ist.

    Ich unterstelle mal daß er C++ lernen will.



  • Ohje, da habe ich ja ein Chaos angerichtet...
    Ich wollte mir nur eine Beispieldatei anlegen. Hilft es, wenn Da keine führenden Nullen sind?
    Bzw. tut es was zur Sache, wenn in einem string führende Nullen sind?

    LG



  • @PardiMau
    Bei einem String tut sich da garnix, dem ist der Inhalt Hupe. Vllt habe ich da mehr reininterpretiert als wirklich dahintersteckt. Mein erster Gedanke war: Vierstellig? Was passiert, wenn 9999 Einträge nicht mehr ausreichen? Hab da grad sowas erlebt, wo die Seriennummer dreistellig ist und jetzt Gerät 99x ausgeliefert wird.



  • Und leider kann ich mir das Format der txt nicht aussuchen...



  • @PardiMau sagte in Daten aus txt datei in Klasse einlesen:

    Und leider kann ich mir das Format der txt nicht aussuchen...

    Ja was denn nun? Kanst du das Datenformat frestlegen oder nicht? Die Dateiendung spielt dabei überhaupt keine Rolle.



  • @PardiMau Da die Diskussion ja in alle möglichen Formatbereiche abgeschwiffen ist - wie ist denn jetzt dein Stand? Wo stehst du, kommst du klar - wenn nein, hast du konkrete Probleme? Es hilft dir ja nicht, wenn wir hier alle weiter irgendwas mutmaßen.



  • @wob

    #include "pch.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <vector>
    
    using namespace std;
    using std::string;
    
    struct person
    {
    	string Identifikationsnummer;
    	string Name;
    	string Adresse;
    	string Geburtsjahr;
    	vector<string> Eltern;
    	vector<string> Kinder;
    };
    
    int main()
    {
    	//Datei einlesen
    	ifstream in("Datei.txt");
    	
    	vector<person> persons;
    
    	string lines[6];
    
    	while (true)
    	{
    		
    		for (auto& z : lines)
    			getline(in, z);
    		if (!in)
    			break; // Es konnte kein weiterer Datensatz gefunden werden
    		cout << setw(25) << "Identifikationsnummer: " << lines[0] << endl;
    		cout << setw(25) << "Name: " << lines[1] << endl;
    		cout << setw(25) << "Adresse: " << lines[2] << endl;
    		cout << setw(25) << "Geburtsjahr: " << lines[3] << endl;
    		cout << setw(25) << "Eltern: " << lines[4] << endl;
    		cout << setw(25) << "Kinder: " << lines[5] << endl;
    	
    		person{ lines[0],lines[1],lines[2],lines[3]};
    
    		cout << person{};
    	}
    

    Von dem hinzugefügten Adresse nicht beirren lassen, das ist einfach nur ein zusätzlicher string.

    Leider habe ich Probleme mit der Ausgabe. Was habe ich denn da falsch gemacht?



  • @PardiMau sagte in Daten aus txt datei in Klasse einlesen:

    habe ich Probleme

    ist keine Fehlerbeschreibung.



  • @PardiMau sagte in Daten aus txt datei in Klasse einlesen:

      person{ lines[0],lines[1],lines[2],lines[3]};
    
      cout << person{};
    

    Von dem hinzugefügten Adresse nicht beirren lassen, das ist einfach nur ein zusätzlicher string.

    Leider habe ich Probleme mit der Ausgabe. Was habe ich denn da falsch gemacht?

    Was denkst du denn tun diese 2 Zeilen?



  • @Tyrdal

    person{ lines[0],lines[1],lines[2],lines[3]};
    

    ich dachte, ich befülle die die struktur mit den zeilen, die da rein gehören

    und die zeile darunter ist wahrscheinlich quatsch, weil nicht angegeben wurde, was genau ausgegeben werden soll



  • @PardiMau Mit der Zeile erzeugst du eine unbenannte Instanz der Klasse person mit den Daten. Diese unbenannte Instanz benutzt du danach aber nicht mehr. Wenn du mit Warnungen kompilieren würdest, hätte der Compiler die das auch gesagt.

    Und das cout? Hier versucht du eine leere Instanz der person zu übergeben? An sich schon falsch. Aber woher soll cout eigentlich wissen was es mit person anfangen soll. Dafür musst du schon was tun.



  • @Tyrdal

    Ich habe jetzt alle Warnungen anzeigen lassen und da steht leider nichts zur benannten Zeile.

    Ich will natürlich keine unbenannte Instanz erzeugen, ich will eigentlich nur sagen, dass zur ID alle lines [0] gehören usw. Wie kann ich dem Programm denn sonst sagen, was in die struktur kommt?
    Und wenn ich dann einen vector<person> habe, ist der erste Eintrag dann auch automatisch die ersten 6 Zeilen?



  • Dann erzeuge eine Variable davon und gib diese dann aus.

    PS: Hast du denn überhaupt schon eine Ausgabefunktion für die Struktur person erstellt? Denn sonst sollte eigentlich eine Fehlermeldung kommen...


Anmelden zum Antworten