Auslesen und anschließendes Parsen einer .txt



  • Guten Abend,

    vielleicht kann mir jemand einen heißen Tipp in die richtige Richtung geben für folgendes Problem:
    Ich möchte eine .txt Datei einlesen. Diese soll dann Zeilenweise geparst werden. Nach jedem Parservorgang soll ein benutzerdefinierter Typ aus 4 int-Werten, welche der eingelesen geparsten Textzeile entsprechen, erstellt werden.

    Bisher bin ich so weit:

    read_Data()
    {
    	char file_name[128];
    	ifstream file;
            char line[50];
    
    	cin.getline(file_name, 49);
    
            // Öffnen einer Datei im Lesemodus
    	file.open(file_name, ios::in);
    
            // Getter auf Position 0 setzen
    	file.seekg(0, ios::beg);
    
        while (!file.eof())
        {
    		file.getline(line, sizeof(line));
    		get();
        }
    }
    
    T Stream::get()
    {
    	switch (ch) {
    	case ' ': 
    	case '0': 
    	case '1': 
    	case '2': 
    	case '3': 
    	case '4': 
    	case '5': 
    	case '6': 
    	case '7': 
    	case '8': 
    	case '9':
    		{
    			ch.ignore();
    		}
    	default:
    		if (isalpha(ch)) {
    			string s;
    			s += ch;
    			while(cin.get() && isalpha*ch)) s+=ch;
    			if (s == "Hallo") constructor.push_back(m_i1);
    			if (s == "Welt") constructor.push_back(m_i2);
    			if (s == "Guten") constructor.push_back(m_i3);
    			if (s == "Abend") constructor.push_back(m_i4);
    
    			while(constructor.size() != m_constructed) {
    				get();
    			}
    
    			return T(constructor[0], constructor[1], constructor[2], constructor[4]);
    		}
    	}
    }
    

    Das Einlesen der Datei klappt wunderbar, auch über cout << line << '\n' kann ich die gesamte Datei zeilenweise ausgeben lassen.

    Mein Problem:
    Wie übergebe ich die line an die get()-Funktion, sodass diese dann Zeichen für Zeichen durchswitcht und sich u. U. rekursiv aufruft, da mehrere int-Werte push_back't werden sollen?

    Mein Ansatz:
    Ich übergebe an die Funktion get() via Pointer auf line, da dies ein Array aus 50 Chars ist. Ferner greife ich dann via cin.get(line) auf das Array zu und lese Zeichen für Zeichen in eine noch nicht deklarierte Variable char ch ein?! Klappt nicht wirklich... Eine andere Option wäre es aus den eingelesenen Zeilen einen String zu erstellen, den kann man bestimmt irgendwie via cin.get() durchlaufen. Also das abklappern des Streams via cin klappt nicht so wirklich, ist auch eher für Benutzereingaben prädestiniert.
    Was benutzt man denn anstatt dessen?

    Freue mich über Tipps 😉



  • Manchmal ist es ganz gut, wenn man sich kurz ablenkt 😉

    std:getline(...) bietet die Möglichkeit die eingelesene Zeile in eine Variable zu speichern und diese unmittelbar weiter zu übergeben.

    Das parsen eines Strings stellt kein Problem dar.

    Trotzdem danke 😉



  • std::ifstream is("file.txt");
    
    int a, b, c, d;
    while(file >> a >> b >> c >> d)
    {
        // tu was damit
    }
    

    Das Leben kann so einfach sein... 😉

    Edit: Achso, du liest Strings ein und willst die auf ints mappen. Auch kein Problem, statt int std::string hin.



  • Kennst du das, wenn man zeilenweise Code, an dem man stundenlang gearbeitet hat mit einem 4-Zeiler ersetzen kann?

    Ich weiß nie so richtig, ob ich mich nun freuen soll oder nicht...

    Bisher habe ich nur in Java mit regulären Ausdrücken gearbeitet, das ist da so viel einfacher kommt mir vor. Mit dem ifstream-Konstruktor ist das echt easy xD

    Danke 😉



  • Regex ist für sowas meiner Meinung nach total falsch. Wie du siehst, geht das bereits mit dem Filestream alleine 😉


Log in to reply