Datei einlesen und aufteilen



  • Hallo!

    Ich bin jetzt an ein Problem gestoßen.
    Ich wollte eine Datei einlesen:

    while (!datei.eof()) {
      ch = datei.get();
      cout << ch;
    }
    

    Klappt alles wunderbar! Aber jetzt das Problem:
    Die Datei ist folgendermaßen aufgebaut:
    [quote]
    Data1:Wert1
    Data2:Wert2
    Data3:Wert3
    [...]
    [/quote]
    Die Datei soll jetzt aber so eingelesen werden, dass es nur erstmal bis "Data1" geht und das dann in eine char-Variable gespeichert wird, dann kommt das Trennzeichen ":", dann wird der andere Wert, nämlich "Wert1" in eine andere char Variable gespeichert. Wie geht das? In php könnte man das mit der Funktion explode() vergleichen, da kann man nämlich einen sogenannten string separator eingeben, in diesem Fall ":".

    Ich hoffe ihr könnt mir helfen.

    Danke



  • Du kannst die Datei zeilenweise mit getline() einlesen und dann per Hand die einzelnen Zeilen zerlegen:

    ifstream datei("data.txt");
    string input;
    while(datei)
    {
      getline(datei,input);
      int pos=input.find(':');
      string d=input.substr(0,pos);
      string w=input.substr(pos+1);
      //verarbeite d (alles vor :) und w (alles nach :)
    }
    


  • Hallo Karl,

    es empfiehlt sich, eine Struktur oder Klasse zu bauen, die eine Zeile bzw. ein Paar aus Namen (?) und Wert kapselt (hier 'Record' genannt). Dieser Record wird mit einem Streaming-Operator ausgerüstet und dann ist das Einlesen kein Problem mehr

    #include <algorithm>    // copy
    #include <fstream>
    #include <iostream>
    #include <iterator>     // istream_iterator, back_inserter
    #include <string>
    #include <vector>
    
    struct Record
    {
        friend std::istream& operator>>( std::istream& in, Record& zl )
        {
            std::getline( in, zl.m_name, ':' );  // Name lesen bis ':'
            return std::getline( in, zl.m_value ); // Wert bis Zeilen-Ende lesen
        }
        std::string m_name;
        std::string m_value;
    };
    
    int main()
    {
        using namespace std;
        vector< Record > v;
        ifstream in( "input.txt" );
        copy( istream_iterator< Record >( in ), istream_iterator< Record >(),
            back_inserter( v ) );
        cout << v.size() << " Eintraege gelesen" << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Vielen Dank für die umfangreiche Hilfe von euch beiden!


Anmelden zum Antworten