Zeichenfolge in Textdatei suchen und in Tabelle einordnen



  • Hallo,

    vornweg: Ich bin absoluter Neuling in C++ und auch in diesem Forum und hoffe, dass die Frage so oder so ähnlich nicht schon 1092380mal gefragt wurde und ich sie auch nicht ins falsche Teilforum geschrieben habe.
    Die grundlegendsten Grundlagen kenne ich aber, ich weiß wie die einfachsten Datentypen funktionieren, welche einfache Schleifen es gibt und wie Funktionen prinzipiell arbeiten.

    nun zur eigentlichen Frage:

    Ich möchte mir ein kleines Programm schreiben mit dem ich aus einer .txt einen Wert herauskopieren möchte. Die Datei ist ein Protokoll und der Wert befindet sich immer hinter einer bestimmten Zeichenfolge (es geht um einen Messfehler welcher im Muster "Fehler = 0.1" angegeben ist, die 0.1 möchte ich dann aus dem Text (mehrfach) rauskopieren.
    Die Fehler möchte ich dann einen nach dem anderen ans Ende einer Zeile einer anderen Textdatei kopieren (quasi als neue Tabellenspalte). Wichtig ist, dass der erste gefundene Wert an die erste Zeile kopiert wird, der 2. an die 2. Zeile usw.
    (Natürlich muss es nicht unbedingt für 2 getrennte Textdateien funktionieren, ich kann ja auch die eine in die andere reinkopieren).
    Ich habe schon ein bisschen gegoogelt und was über find() und streams gefunden, bin aber noch etwas überfordert.

    Würde mich freuen wenn mir hier jemand helfen kann 🙂 Freundliche Grüße auf jeden Fall.



  • Hallo Gandalf93,

    Willkommen im C++-Forum.

    Zu Deiner Frage: Bedenke zunächst, dass eine Datei aus einem Strom von Zeichen besteht. Die Zeilen, die Du z.B. in einem Editor siehst, kommen nur dadurch zustande, dass ab und an ein Line-Feed-Zeichen auftaucht, was ein Zeilenende markiert.
    Das bedeutet auch, das Du nicht einfach innerhalb einer Datei in eine Zeile 'etwas anhängen' kannst, sondern man muss immer ein neue Zeichenfolge in eine bestehende einfügen. Das funktioniert i.A. auch nur so dass man die Datei bzw. Teile davon in den Speicher des Rechners lädt, dort den Zeichenstrom manipuliert und anschließend wieder als (neue) Datei zurück auf die Platte schreibt.

    Das Lesen aus der Datei könnte in Deinem Fall so aussehen:

    #include <iostream> // cout, endl
    #include <fstream>  // ifstream
    #include <limits> // numeric_limits
    
    int main()
    {
        using namespace std;
        auto ALLES_BIS = numeric_limits< streamsize >::max();
        ifstream datei("input.txt");
        if( !datei.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return 0;
        }
        for( double messfehler; datei.ignore( ALLES_BIS, '=' ) >> messfehler; )
            cout << "Messfehler: " << messfehler << endl;
        return 0;
    }
    

    Ich habe mir dabei zu Nutze gemacht, dass anscheinend in jeder Zeile vor dem eigentlichen Wert, immer ein '='-Zeichen steht. Wenn das so ist kann man mittels der Methode 'ignore' alle Zeichen vor dem '=' inklusive des '=' überlesen und anschließend den Wert einlesen.
    Anschließend gebe ich den Wert nur zur Kontrolle auf der Konsole aus.

    Versuche mal, dieses Programm bei Dir zum laufen zu bringen und melde Dich dann nochmal.

    Gruß
    Werner



  • Hi Zusammen, hierzu habe Ich eine Zwischenfrage

    Eine Datei sieht bei mir wie folgt aus

    ; ZA-Instance
    ;[Instance_0F38]
    ;Inst_Id =0F38
    ;Node_Addr=204.14.49.100
    ;Media_Typ=3
    ;Time_Out =15

    ; Local Device Instance
    [Local]
    Inst_Id =0F38
    Node_Addr=204.14.49.100
    Media_Typ=3
    Time_Out =15
    COMPUTER=ZE3896-9000

    Ich möchte die Datei auslesen und in einer Neuen TXT fortlaufend die Zeilen mit Inst_ID=, Node_Addr= und Computer= wobei alle Zeilen die mit ; beginnen NICHT berügsichtig werden sollen ? kann mir da jemand ein Beispiel zu machen ?



  • Sonderzeichen schrieb:

    Ich möchte die Datei auslesen und in einer Neuen TXT fortlaufend die Zeilen mit Inst_ID=, Node_Addr= und Computer= wobei alle Zeilen die mit ; beginnen NICHT berücksichtigt werden sollen ? kann mir da jemand ein Beispiel zu machen ?

    .. nichts leichter als das:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
        using namespace std;
        ifstream quelle("input.txt");
        if( !quelle.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return 0;
        }
        ofstream ziel("output.txt");
        for( string zeile; getline( quelle, zeile ); )
            if( zeile.length() < 1 || zeile[0] != ';' )
                ziel << zeile << endl;
        return 0;
    }
    

    Ansonsten empfehle ich Dir die Beiträge von SeppJ und mir aus diesem Thread https://www.c-plusplus.net/forum/p2270996 oder vielleicht hilft auch dieser Thread weiter https://www.c-plusplus.net/forum/308687-full.

    Gruß
    Werner


Log in to reply