Text einlesen



  • der Header muss dabei ja auch berücksichtigt werden.
    und da dieser in jeder textdatei anders aussehen kann soll man eine zeile angeben können um von dort aus die zahlen einzeln einlesen zu können.

    könntet ihr mir ein beispiel geben wie isch zb die ersten 5 zeilen weglesen kann?
    am besten mit einer for-schleife. die weggelesenen daten müssen nirgendwo gespeichert oder ausgegeben werden, relevant sind für mich nur die messdaten danach.



  • SeppJ schrieb:

    Da es immer nur eine Zahl pro Zeile ist, wäre getline wohl eher hinderlich. Lies einfach die Zahlen so wie sie sind ein. Zeilen direkt anspringen kannst du bei ungeleichmäßiger Zeilenlänge ohnehin nicht.

    Zumindest zum Überlesen des Datei-Headers könnte man es verwenden - alternativ könnte auch i(f)stream::ignore() dafür ausreichen.


  • Mod

    Neuling01 schrieb:

    der Header muss dabei ja auch berücksichtigt werden.
    und da dieser in jeder textdatei anders aussehen kann soll man eine zeile angeben können um von dort aus die zahlen einzeln einlesen zu können.

    könntet ihr mir ein beispiel geben wie isch zb die ersten 5 zeilen weglesen kann?
    am besten mit einer for-schleife. die weggelesenen daten müssen nirgendwo gespeichert oder ausgegeben werden, relevant sind für mich nur die messdaten danach.

    Wie wäre es mal mit ein bisschen Initiative? Das ist wirklich einfach. Aber mal angenommen, du wärest in der Datei am Ende des Headers (wie man dahin kommt, machst du bitte selber), dann kannst du danach beispielsweise so einlesen:

    // Einlesen aus "text" von "von" bis "bis":
    for(int i=1; i<=bis; ++i)
     {
       double zahl;
       text >> zahl;
       if (i >= von) cout << zahl;
     }
    


  • SeppJ genau da liegt ja mein problem ... die einzelnen Zahlen einlesen kann ich.
    auch einen definierten Header weglesen ist nicht so schwer.
    aber bei mir ist der header jedesmal ander (reihenanzahl und inhalt), also hat kein definiertes ende.
    deswegen war es meine überlegung sich die .txt anzugucken und die anzahl an reihen, die der jeweilige header dann hat, wegzulesen.
    jedoch hab ich es erst versucht mit weglesen bis zeilenumbruch und das x mal, da kam ich nicht weiter weil ich nicht wusste wie man zeilenumbruch definiert.
    und nun probier ich grade das mit getline().


  • Mod

    Woran erkennst du denn als Mensch das Ende des Headers?



  • Hast du denn irgendein festes Merkmal, um das Ende des Headers im Programm zu erkennen (z.B. die letzte Zeile vor den Nutzdaten ist immer "Weg-pur [?m]")? Wenn ja, würde ich solange Daten einlesen, bis ich dieses Merkmal gelesen habe.
    Andernfalls kann man auch per peek() das Zeichen an der Leseposition herausfinden, ohne weiterzulesen.

    PS: Für die Zukunft: das Zeilenende wäre '\n' 😃



  • Neuling01 schrieb:

    Beispiel wäre :

    Schaltbildname : Laser-trigon-V010-2007-02-13
    Aufgenommen am : 13.02.07. 9:05:51
    Blocklaenge : 1
    Delta : 100 sec.
    Kanalzahl : 3

    Weg-pur [?m]
    -42.11
    -48.12
    -47.51
    -8.14
    -41.4
    -18.82
    -25.13
    -42.72
    -31.84
    -59
    -35.1
    -52.08
    -65.82
    -11.9
    -53.71
    -82.09
    -71
    -31.64
    -98.27
    -60.63
    -116.88
    -121.05
    -112.51

    bis "Weg-pur [?m]" wäre der header, danach kommen die daten ... nun endet aber nicht jeder header mit"Weg-pur [?m]".



  • Sind die Nutzwerte denn alle negativ? Und kann es auch passieren, daß im Kopfbereich ein numerischer Eintrag auftritt?



  • Also wie ich das verstanden habe, möchtest du die aktuelle Eingabe (Messdaten) abspeichern um sie später wieder aufzurufen.

    Ich habe mal grade ein kleines Programm geschrieben,was vielleicht deine Anforderungen erfüllen könnte:

    #include "../../../std_lib_facilities.h"
    #include "conio.h"
    
    int main()
    {
    	vector<double> temps;
    	double temp;
    	int i = 0;
    
    	cout<<"Geben Sie die Daten getrennt von einem Leertsatendruck ein, wenn sie fertig sind druecken sie strg+z!\n";
    	while(cin>>temp){
    		temps.push_back(temp);
    	}
    
    	cout<<'\n';
    	cout<<"Die Daten lauten:\n";
    	while(i< temps.size()){
    		cout<<temps[i]<<'\n';
    		++ i;
    	}
    	getch();
    }
    

    Der Code enthält eine saubere Eingabeaufgorderung.
    Zum Programm: Hier werden die Daten in einen vector-Container eingelsen und dann ausgegeben.

    Ich hoffe ich konnte dir weiterhelfen.

    Mfg Golfi1812 💡



  • Hi, ich muss doch nochmal nerven.
    Nach vielem rumschreiben bin ich nu auf Pointer gekommen und hab mich dort mal eingelesen.
    Achja Problem wie gehabt, einlesen einer ganzen zeile ohne spezifisches ende mit char oder string und keiner spezifischen char-anzahl.
    bis jetzt habe ich:

    FILE *textdaten = fopen( "D://Daten_200.txt", "r" );
    for (i=1;i<=anfang;i++)
    {
    fgets (datei , 200 , textdaten);
    puts (datei);
    fclose (textdaten);
    }

    wobei anfang vorher noch eingegeben werden kann, es soll dann später der anfang der messdaten (bzw der ersten reihe mit messdaten welche eingelesen werden sollen) darstellen.

    nun liest er die erste zeile ein und gibt mir die "anfang"-mal wieder aus, jemand ne ideen wo der fehler liegt?



  • ok sorry für die dumme frage, habs selbst bemerkt.
    man sollte die datei nicht innerhalb der schleife schließen 🙄

    also mit pointern kann ich nun zeilenweise einlesen, für diejenigen, die dasselbe problem haben.


  • Mod

    Jetzt hast du die schlechteste Lösung überhaupt gefunden 🙄


Anmelden zum Antworten