Text einlesen... array oder vektor Implementierungshilfe



  • Hallo habe folgendes Problem:

    Ich soll eine Textdatei einlesen und die darin gespeicherten Werte sinvoll verarbeiten.
    Das mache ich derzeit mit

    string s;
    ifstream in("test.txt"); // öffne datei
    while(getline(in, s))
    ...
    

    Die Datei sieht etwa so aus:

    " 94"," 86"," "
    

    Am Ende sollen die Messwerte miteinander verrechnet werden. 2 "Spalten" wären also ganz nützlich.

    Habe bisher rudimentäre Erfahrungen mit c++ gemacht. Deshalb meine Frage:
    Wie würde man das am besten Implementieren. In ein Array schieben, als String belassen oder doch nen Vektor?
    Kann man während des Einlesens schon die " und , filtern und wenn ja wie?
    Es sind ungefähr 10000 Zeilen zu verarbeiten.

    Ich arbeite derzeit mit VisualStudio.net. Es soll aber eine Konsolenanwendung bleiben und so portabel wie möglich sein.

    Hat jemand vielleicht nen Codebeispiel oder Anregungen?

    Danke schon mal

    lucky



  • also ich würds auf jedenfall in eine stl containerklasse ballern... allein schon weil ich kein bock habe mich mit der speicherallokierung rumzuärgern...

    wie du die datei auslesen willst ist geschmacksache... für sowas lese ich meist auch immr ne zeile ein und parse die von hand (meine lieblingsc-funktion in diesem zusammenhang ist strtok) aber das ist wie gesagt geschmackfrage...

    es kommt vor allen dingen darauf an ob die zeilen bei dir immer gleich aussehen (von den messwerten mal absehen) also ob immer hockomma lerzeichen zahl hockomma kommt... und das eine feste anzahl mal... dann könntest du z.b. auch ganz gut sscanf zum parsen verwenden...
    naja gibt auch c++-möglichkeiten das zu lösen aber ich mach das string parsen meist immer c-like so das ich bei c++ keine wirkliche empfehlung geben kann und will...



  • Erklär das mal mit der Kontrainerklasse näher bitte.
    Am Ende brauch ich im Prinzip 2 Spalten. Muss häufig auf den Verlauf der Messwerte zurück greifen, da am Ende Daten an eine grafische Auweertung übergeben werden sollen. (Messkurve)
    Ich komme von der Shellprogrammierung (und perl)-im Gegensatz zu C++ doch etwas anders vom Aufbau.

    Zu den Daten:

    Die sind alle in diesem Format. Also "","" Lediglich die Messwerte variieren.
    Ich könnte eine Funktion gebrauchen, die mir lediglich Zahlen liest und den Rest filtert. (sonst muss ich soviel suchen/ersetzen)
    Bis jetzt kenne ich nur die find() Funktion. Aber es gibt doch sicher komfortablere oder etwa nicht?

    by the way:

    Wie bekomme ich denn den String (bzw. die Messdaten) in ein arry. Mein Compiler sagt mir immer Typenkonvertierung nicht möglich...

    Greez

    lucky



  • hmm du wirst ja vermutlich in jeder zeile irgendwie zusammengehörige messwerte haben

    dafür würd ich mir erstmal ein struct basteln das eine zeile aufnehmen kann

    typedef struct{double wert1; int tralala;......}messwertdatensatz; //oder wie auch immer so ein datensatz bei dir aussieht
    

    so und jetzt legst du z.b. einen std::vector an

    std::vector<messwertdatensatz> messwertearray;
    
    //hier immer eine zeile aus der datei auslesen und dann den string eventuell mit strtok parsen (schau mal in die doku von strtok ist eigentlich ziemlich intuitiv zu bedienen...wenns immer die gleichen zeilen sind ausser das sich die werte ändern ist wahrscheinlich sscanf einfacher zu verwenden
    
    messwertdatensatz tmp; //hier ballerst du dann deine zeile rein
    
    //und dann jagst du sie in den vector
    
    messwertearray.push_back(tmp);
    
    //den vector kannst du benutzen wie ein normales array und er kann halt noch ne ein wenig mehr...
    


  • Vielen Dank für die Anregungen. Werde jetzt erst mal ein paar Tage herumprobieren und dann mal schauen ob was vernünftiges bei rauskommt.

    wenn jemanden noch was einfällt...nur zu 🙂

    THX@all

    lucky



  • lucky_streikt schrieb:

    Kann man während des Einlesens schon die " und , filtern und wenn ja wie?
    lucky

    Hi
    Guck dir doch mal istream::ignore an. Das dürfte dir weiterhelfen.


Anmelden zum Antworten