Daten aus TXT lesen und in Var speichern



  • Morgen,

    also entweder bin ich zu glatt zum suchen oder es gibt wirklich nichts passendes.

    Mein Problem ist folgendes, ich habe ein TXT Datei die ich in einer Funktion mit 8 Zahlenwerte (alle durch ein Tabulator getrennt) beschreibe. Da mit jedem Funktionsdurchlauf eine neue Zeile mi jeweils 8 Zahlenwerten hinzukommen stellt sich folgendes Problem. Eine andere Funktion soll die jeweils LETZTE Zeile bzw. die letzten 8 hinzugefügten Werte auslesen und jeweils ein Zahlenwert in eine seperate Variable speichern.

    Also rhein Structogrammtechnische habe ich mir das so gedacht

    Datei öffnen (villeicht am besten mit dem Parameter(ios::ate)?) → Letzte Zeile anfangen zu lesen → sobald eine Zahl erscheint diese in eine Variable kopieren (typ double) → sobald die Funktion ein blank oder Tabulator findet aufhöhren (also quasi die variable "abschliessen" → weitermachen bis eine neue Zahl auftaucht und diese in eine neue double varible schreiben → und das ganze spiel 8 mal.

    Ich hoffe ich habe das Problem verständlich geschildert.

    M.f.G

    Kevman

    Edit

    Wie gesagt mir fehlt nur nen anstoss wie man das in die Sprache fassen könnte.

    OK also ich habe jetzt schonmal geschafft die Werte aus der Datei (habs jetzt als dat) in variablen zu speichern.

    ifstream infile;
    double b0,b1,b2,b3,b4,b5,b6,b7; //variblen
    
    infile.open("Test.dat",ios::in);  //Datei öffnen 
    
    (infile >> b0 >> b1 >> b2 >> b3 >> b4 >> b5 >> b6 >> b7); // Einlesen von Werten
    
    infile.close();
    
    cout << b0 << " " << b1 << " " << b2 << " " << b3 << " " << b4 << " " << b5 << " " << b6 << " " << b7 << endl;
    

    Wie man sieht steht der cout Befehl hinter der "streamfunktion" und es läuft. Ich kann zumindest die Variablen anwählen etc.

    LEIDER liest er nur die erste Zeile ein. Wie kann ich das Problem lösen? Bzw wie könnte ich die Position des "coursors" an den anfang der letzten zeile setze?



  • Versuche es mal mit while(dat_ein)....

    while(dat_ein)
    {
        dat_ein >> Variable;
    }
    

    Die Variablen als Array, waehre auch recht sinnvoll 😉

    Ivo



  • Naja wie gesagt das Ganzen betrachtetist dynamisch. Das heisst die Werte ändern sich. also wie ich sie auslese weiss ich aber ich brauch wie gesagt nen befehl wie ich die letzte Zeile auslesen kann und zwar immer nur die da ich damit weiterrechnen muss.



  • double Varibale;
    while(dat_ein)
    {
        dat_ein >> Variable;
    }
    cout << Variable;
    

    So bekommst Du nur den letzten Wert ausgegeben. Die Schleife lauft dei Datei durch und liest die Werte ein. Dabei wird die Variable immer wieder neu beschrieben. Wenn keine Daten mehr eingehen, hast Du den letzten Wert, so wolltest Du es doch haben oder? Oder steh steh ich gerade auf dem Schlauch?

    Ivo



  • Naja quasi fast.

    Ich wollte die letzten 8 Werte haben. Ich bin auch gerade a basteln parallel mit while.Wenn du noch ne schöne Lösung hast immer her damit.



  • Nun habe ich gescheckt was Du machen willst...

    Hier mal ein Ansatz:

    - Ermittel per while die Anzahl der Eintrage in der Datei
    - lasse die Schleife bis zu ENDE-8 laufe und verwerfe die Daten
    - Ab ENDE-8 speicherst Du den Wert in Deiner Variable.

    So einfach gehts.

    Ivo



  • ok das klapp soweit. jetzt muss ich das ganze noch irgendwie zeitoptimithinbekommen. weil da teielweise mehr als 20 000 Datensätze à 8 Werte sind. Danke dir.



  • 20000 Datensaetze? Da sollte man echt nicht alles durchgehen

    // setze die Leseposition auf 0 gemessen vom Dateiende
    dat_ein.seekg(0, ios_base::end);
    

    Ivo



  • Ivo schrieb:

    // setze die Leseposition auf 0 gemessen vom Dateiende
    dat_ein.seekg(0, ios_base::end);
    

    Setze den Dateicursor damit auf zB 200 Byte vor Dateiende. Lies von da an in einen vector ein.
    Nimm dann die letzten acht Werte aus dem vector.


Anmelden zum Antworten