textdateien einlesen und auswerten



  • hi,
    wie kann ich textdatein am besten auswerten, wenn ich z.b zahlen durch semikolons getrennt hab und die zahlen in ein array auslesen möchte?

    danke für hilfe
    steve

    ps: frohe weihnachten!



  • http://www.c-plusplus.net/forum/viewtopic.php?t=39469

    #include <iostream>
    #inlcude <fstream>
    #inlcude <vector>
    using namespace std;
    
    int main()
    {
        ifstream datei("daten.txt");
        vector<int> v;
    
        int tmp = 0;
        while(datei >> tmp)
        {
            v.push_back( tmp );
            datei.ignore( 1 );  // überspringt das ;
        }
    
        for(int i = 0; i < v.size(); ++i)
            cout << i << ": " <<  v[i] << "\n";
    }
    

    vielleicht leichter zu verstehen für ein anfänger

    #include <iostream>
    #inlcude <fstream>
    #inlcude <vector>
    using namespace std;
    
    int main()
    {
        ifstream datei("daten.txt");
        vector<int> v;
    
        int tmp = 0;
        datei >> tmp
        while(datei.good())
        {
            v.push_back( tmp );
    
            datei >> tmp
            datei.ignore( 1 );  // überspringt das semikolon nach der zahl
        }
    
        for(int i = 0; i < v.size(); ++i)
            cout << i << ": " <<  v[i] << "\n";
    }
    


  • danke!
    hm, aber was ist wenn das eine mehrstellige zahl wie 12 ist? dann liest er doch die 1 aus und ignoriert die 2, wenn ich das richtig verstehe oder?

    grüsse steve



  • Ja! Da liegst du richtig. Gerards bsp. war also nur ein Ansazt..
    Du musst in einer schleife Zeichen für Zeichen alle mit ';' vergleichen und wenn eine Gleichheit vorliegt das betroffene Zeichen ignorieren.



  • wenn tmp ein char wäre würde er nur eine ziffer einlessen, wie sich op>> genau verhält hängt vom typen ab
    z.b. bei int geht er solange weiter wie ziffern kommen, kommt z.b. ein punkt dan stopt er
    bei float liest er auch den nachkommer (nachpunkt) teil ein
    bei std::string liest er bis zu einen whitespace



  • hmja da liegt ja grad mein problem, wie ich das am günstigsten mach 🙂
    /edit: @gerard: hm ok ich probier des mal



  • du könntest doch z.b. zeichenweise einlesen (so wie in Gerards beispiel) und jeweils beim trennzeichen das ganze in den Vektor schieben. etwa so:

    vector<string> eintraege;
    string tmp;
    while(datei.good())
    {
        char z;
        datei >> z;
        if (z == ';')
           eintraege.push_back(tmp);
        else
           tmp += z;
    }
    

    oder so ähnlich :xmas1:



  • @Steve03 probiere doch etwas rum, wenn etwas unklar ist such im netzt ein beispiel oder frage im forum

    @breakermaker. ja das wäre ne nette übung, aber mein ansatzt ist schon richtg datei >> tmp liest eine ganze zahl ein



  • hm aber was wenn ich zeilenweise verarbeiten will.. ich hab das schonmal so gemacht:
    cout << "Dateiname: ";
    cin >> filename;
    ifstream readfile (filename);
    if (readfile) {
    while (! readfile.eof()) {
    readfile.getline (buffer,100);
    istrstream s(buffer,101);
    s >> x >> y >> z;
    var[i].x=x;
    var[i].y=y;
    var[i].z=z;
    i++;
    }
    }
    else cout << "Fehler beim Lesen der Datei;

    bloß was mir da nicht gefällt ist das "istrstream s(buffer,101);" in der schleife, ich hab keine ahnung wie ich das sonst auslesen kann 😕



  • Steve03 schrieb:

    s >> x >> y >> z;
    var[i].x=x;
    var[i].y=y;
    var[i].z=z;
    

    das würd ich so nicht machen. die reihenfolge der operatoren ist gleub ich nirgends exakt spezifiziert. auch find ich den stream etwas komisch. was spricht denn gegen zeilenweises einlesen, wenn du jede zeile dann einzeln durchläufst, und bei jedem trennzeichen die "zielvariable" änderst?



  • hm, bloß um die einzelnen zahlen zeilenweise so auszulesen brauch ich ja n stream,
    und ich muss den ja für jede zeile erneuern, geht das noch irgendwie anders als mit dem istrstream s(buffer,101); in der schleife?



  • Korbinian schrieb:

    Steve03 schrieb:

    s >> x >> y >> z;
    var[i].x=x;
    var[i].y=y;
    var[i].z=z;
    

    das würd ich so nicht machen. die reihenfolge der operatoren ist gleub ich nirgends exakt spezifiziert.

    na und?
    es ist doch egal, ob er x, y oder z zuerst auswertet, denn keiner dieser ausdrücke hat seiteneffekte.

    mir ist nur nicht ganz klar, warum es hier temporaere variablen gibt:

    s>>var[i].x>>var[i].y>>var[i]>>z;
    

    finde ich schöner

    allerdings würde ich wohl eher Gerards source verwenden...



  • gibt es ne möglichkeit in einem stream in die nächste zeile zu springen?



  • Shade Of Mine schrieb:

    es ist doch egal, ob er x, y oder z zuerst auswertet, denn keiner dieser ausdrücke hat seiteneffekte.

    das ist glaub ich nicht gesagt. es kommt drauf an, ob die einlesereihenfolge eine rolle spielt. wenn der erste genau in das erste, der 2. ins 2. usw muss. aber egal 🙂



  • hallo

    /C++ Code:
    #include <iostream>
    #inlcude <fstream>
    #inlcude <vector>
    using namespace std;

    int main()
    {
    ifstream datei("daten.txt");
    vector<int> v;

    int tmp = 0;
    while(datei >> tmp)
    {
    v.push_back( tmp );
    datei.ignore( 1 ); // überspringt das ;
    }

    for(int i = 0; i < v.size(); ++i)
    cout << i << ": " << v[i] << "\n";
    }

    so müsste es klappen :p b
    robin


Anmelden zum Antworten