In nächste Zeile springen



  • Du meinst, da es ja eine While-Loop ist, ist die Loop beim nächsten durchgang schon in der nächsten Zeile?!
    Das Problem liegt aber glaub ich darin, dass nach dem geposteted Codefragment noch eine Menge kommt, die auf dem Finden des Keywords aufbaut. Dass heißt, dass ich das Finden des ersten Keywords, das Springen in die nächste Zeile und wiederrum das Finden des neuen Keywords in der neuen Zeile(Zeile+1), in einem Druchgang passieren muss, also die Loop garnicht in die nächste Zeile springen kann.
    Kannst du das ungefähr nachvollziehen?



  • Das hat mit der while-Schleife nichts zu tun, das macht das getline() ganz von alleine: Es liest von der aktuellen Position alles bis einschließlich des Zeilenendes ein, wirft das \n weg und gibt den Rest der Zeile zurück. Das bedeutet, du kannst ganz einfach weiterlesen, um die nächsten Eingaben aus der Datei zu erhalten:

    while(getline(data,zeile)) 
        { 
        size_t pPosn = zeile.find("Autohaus"); 
        if (pPosn!=string::npos) 
        { 
            TRACE("gefunden Pos: %d - %s\n",pPosn,(zeile.substr(pPosn)+"?").c_str()); 
            m_ctlLISTOUTPUT.AddString(zeile.substr(pPosn,8).c_str());
            string naechste_zeile;
            getline(data,nachste_zeile);
            ...
        }                
    }
    


  • Ahhh, jetzt verstehe ich was du meinst!!!!
    Stimmt daran hab ich garnicht gedacht. Ich war immer so auf die Loop fixiert. dass ich das völlig übersehen hab.
    Vielen Dank für dein Hilfe. 🙂
    Ich werde das gleich mal ausprobieren!!



  • Hey super, das hat geklappt.
    Ich hab mir zur Überprüfung danach noch in einer MessageBox die komplette nächste Zeile anezigen lassen und es sieht gut aus 😉

    getline(data,naechste_zeile);
    ize_t tPosn = naechste_zeile.find("AnzAutos");
    TRACE("gefunden Pos: %d - %s\n",tPosn,(naechste_zeile.substr(tPosn)+"?").c_str());
    m_ctlLISTOUTPUT.AddString(naechste_zeile.substr(tPosn,8).c_str());
    

    Nun hab ich aber noch ne klitze kleine Frage.
    Wie kann ich denn nun die Zahl hinter dem AnzAutos = 4 sondieren.
    Ich muss sie dann noch irgendwie umwandeln, dass mein Programm weiß:
    aha, die Zahl 4 heißt das und das 4 mal ausgeben.
    Hättest du da noch einen Tip für mich?



  • Zunächst mußt du dir den Teil hinter dem "=" aus der Zeile herausschneiden (mit find() und substr()) - und dann in eine Zahl umwandeln (siehe C++ FAQ "einmal Zahl und zurück").



  • Ich hab dazu noch eine Frage.
    Was ist denn, wenn ich nicht weiß, welche Zahl sich sich hinter dem "=" befindet.
    Kann ich das trotzdem mit find() uns substr() machen?
    Das einzige was ich weiß, ist das sich hinter dem gefunden String ein "= Zahl" befindet. Diese kann auch 2 Stellen haben.

    Danke für eure Hilfe



  • Du suchst mit find() das = Zeichen und schneidest anschließend mit substr() alles aus dem String heraus, was dahinter steht. Anschließend kannst du den rausgeschnittenen Teil nehmen und in einen int umwandeln (wie das geht, erfährst du immer noch in der C++ FAQ).



  • Ich hab das jetzt mal versucht hinzubekommen und es hat geklappt.

    size_t tPosn = naechste_zeile.find("AnzAutos = ");
    
    //Schneidet die ersten 2 Char nach dem "AnzAutos = " aus
    m_ctlLISTOUTPUT.AddString(naechste_zeile.substr(tPosn+11,2).c_str());
    CString number = naechste_zeile.substr(tPosn+11,2).c_str();
    
    //CString wird in Int umgewandelt
    int real_number = atoi(number);
    

    Ich kann damit jetzt alle 2stelligen Zahlen nach dem AnzAutos raussuchen und umwandeln.

    Kennst du noch eine elegantere Lösung?
    Ansnsten vielen Danke für deine Hilfe und die Tipps.
    Die waren echt Gold wert 🙂

    Grüße
    TheRod



  • Ja, die Zwischenumwandlung in einen CString kannst du weglassen. (und wenn du das ",2" bei den substr()-Aufrufen weglässt, schluckt der Code sogar Eingaben, die mehr als 2 Stellen haben)



  • Nochmals vielen Dank für deine tatkräftige Hilfe.
    Das klappt alles wie am Schnürrchen 🙂

    Grüße
    TheRod


Anmelden zum Antworten