Wert nach einem bestimmten Satz in einer txt datei suchen



  • Habe folgendes Problem.
    Ich will einen Wert in eine Variable speichern jedoch müssten in der Textzeile gewisse Bedingungen erfüllt werden um auch sicher zu seihen das es auch der richtige Wert ist.

    Text Datei:

    Unwichtiger Text..
    Unwichtiger Text..
    Unwichtiger Text..
    ....
    <MOVE FlowID="1" X="X1" Y="Y1"/>
    <MOVE FlowID="1" X="X2" Y="Y2"/>
    <MOVE FlowID="1" X="X3" Y="Y3"/>
    <MOVE FlowID="1" X="X4" Y="Y4"/>
    ....
    Unwichtiger Text..
    Unwichtiger Text..
    Unwichtiger Text..

    Am besten suche ich nach MOVE FlowID und wenn er diesen String findet soll er den nächsten X Wert in einen float speichern (das selbe mit Y).
    Dann soll X1 mit X2 verglichen weden und X2 mit X3 und X3 mit X4 usw...
    Als nächstes kommt eine if else Verzweigung mit der ich mich auskenne.
    Ich weiss wie ich die Datei öffne und auch dem String suche.

    P.S Ich habe Java Grundkenntnisse in C++ nur das Basic Tutorial durchgemacht.

    Danke schon mal in voraus Jungs.


  • Mod

    Ist der restliche Text wirklich unwichtig oder kann da zum Beispiel auch ein Kommentar stehen, der erklärt, wie man MOVE FlowID richtig einsetzt?



  • Der Restliche Text ist unwichtig für mich jedoch sollte er nicht geändert werden.


  • Mod

    BoomC schrieb:

    Der Restliche Text ist unwichtig für mich jedoch sollte er nicht geändert werden.

    Ich meine, ob der restliche Text wirklich unwichtig für das Finden von "MOVE FlowID" ist. Schlechte Parser scheitern daran, dass sie versehentlich Kommentare oder Werte aus ganz anderen Bereichen der Datei fälschlicherweise als ihre Zuständigkeit erkennen, da sie nur nach einem bestimmten Wort suchen, anstatt das Format richtig zu verarbeiten.

    Ich frage deshalb, weil dein Format doch sehr danach aussieht, als würde es beliebigen Inhalt und auch beliebige Kommentare erlauben. Also auch das Wort "MOVE FlowID" an völlig unzusammenhängenden Stellen in der Datei.



  • Der Restliche Text ist wirklich unwichtig und MOVE FlowID ist kein komentar sondern eine Anweisung und immer wenn die Anweisung kommt sollen die X und Y Werte verglichen werden. Der Unwichtige Text verändert sich immer es könnte sonst was da stehen alles was zählt ist MOVE FlowID.



  • BoomC schrieb:

    MOVE FlowID ist kein komentar sondern eine Anweisung

    es geht darum, dass es ein kommentar sein *könnte*. vielleicht steht da ein beispiel, wie die syntax aufgebaut ist. das sollst du nicht parsen.



  • BoomC schrieb:

    Der Restliche Text ist wirklich unwichtig

    Ja, und das glauben wir dir. Nur ist der Punkt, dass dein Parser ein ganzes Stück komplexer wird, wenn die Kommentare überall die zu suchenden Schlüsselworte stehen haben.



  • MOVE FlowID ist einzigartig.
    Dieser String kommt nur so mit den X und Y Werten vor.
    Es gibt keine Zeile:
    Beispiel bla bla MOVE FlowID bla bla.



  • In meinem ersten Post steht der Satz "Ich weiss wie ich die Datei öffne und auch dem String suche. " damit ist hoffentlich das Tema beendet.
    Eigentliche Frage:
    Wie speichere ich den Wert X1 und Y1 in float's um sie dann mit der nächsten Zeile zu vergleichen?



  • Da Du ja im Prinzip dieses Format(xml?) hast

    <TAG_NAME Attribut1 Attribut2 Attribut3/>

    würde ich so suchen:
    1. Suche nach '<'
    2. Suche nach "/>"
    3. Substring zwischen den beiden Stringpositionen extrahieren.
    4. TAG_NAME != "MOVE" gehe zu 1.
    5. Attribut1 != "FlowID" gehe zu 1.
    6. Attribut2 und Attribut3 verarbeiten

    Damit kannst Du auch eventuelle Kommentare unbeschadet überlesen. Ausser
    irgend ein Depp schreibt einen so einen <Kommentar/>.



  • Jede Zeile fängt mit < und endet mit /> doch wenn du meinst.
    Wie gesagt ich bin ein Blutiger Anfänger und bräuchte ein Beispiel.
    Danke.



  • Ich weiss wie ich die Datei öffne und auch dem String suche.

    Darum bin ich davon ausgegangen dass das nicht das Problem ist 😉

    Ich mag jetzt kein Beispiel machen.

    Wenn die Datei relativ klein ist (<30kB) dann würde ich sie mit einem Stream (siehe: http://www.cplusplus.com/reference/fstream/ifstream/) in einem Rutsch in einen std::string einlesen (siehe: http://www.cplusplus.com/reference/string/string/?kw=string) und dann die Suche
    mit den find Funktionen und das extrahieren mit substr machen.

    Versuche es mal, das Erfolgserlebnis ist grösser wenn Du es selbst machst 😉



  • Die Datei hat jetzt 47kb und die Größe ist nicht immer gleich.



  • Ist das nicht ein WTF-in-the-making? Das Format ist doch offensichtlich XML, also sollte das auch mit einem XML-Parser gemacht werden.



  • Ich weiss nur ungefähr was ein XML-Parser ist und würde doch gerne ein eigenes in C++ Programm haben das den Text Zeile für Zeile liest und dann entsprechend meinen Anweisungen Filtert.



  • Die Datei hat jetzt 47kb und die Größe ist nicht immer gleich.

    Detail!!! lies die Datei in einem Rutsch ein

    3 Minuten nach meinem Post Deine Antwort.... Du hast die verlinkten Seiten nicht mal angeschaut 😞

    Ist das nicht ein WTF-in-the-making? Das Format ist doch offensichtlich XML, also sollte das auch mit einem XML-Parser gemacht werden.

    Ich glaube das ist ein (IMHO gutes und nötiges) Übungsprojekt 😉



  • Ich immer noch auf den Seiten die du vorgeschlagen hast. Habe nur schnell mal auf deinem Post geantwortet.



  • Tja ich komme nicht weiter.
    Das habe ich bis jetzt geschafft.

    #include <fstream>
    using namespace std;
    
    int main()
    {
        fstream f;
        ifstream h;
        string s;
        f.open("1.txt", ios::out);
        getline(h, s);
        if(s == "MOVE FlowID"){
    
        }
        f.close();
    }
    

  • Mod

    Gib deinen Bezeichnern mal aussagekräftige Namen, dann fallen dir hoffentlich schon ein paar Fehler auf.

    Programmier nicht durch zusammenkopieren und verändern von Beispielen. Besonders nicht, wenn du sie nicht verstehst.

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.

    Guck dir auch noch mal die von weicher verlinkten Seiten an, ob dein Vergleich wirklich das ist, was du möchtest.



  • Ich habe die Seiten seit gestern auf als ich das ge-googlet habe.
    Werde aber nicht ganz schlau daraus weil mir Fundamentales Wissen fehlt.
    Ich habe die Fehler gesehen....ups.
    Könntet ihr mir zu meiner Frage helfen?


Anmelden zum Antworten