In nächste Zeile springen
-
Hallo,
ich sitze mal wieder vor meinem PC und hab da ein kleines Problem mit meinem Programm.
Ich hab in einem größeren Programm ein kleinen Teil, der ein .txt File nach einem bestimmten Keyword durchsucht. Findet er das Keyword, dann führt er ein bestimmte Aktion aus, wenn nicht dann was anders.
Nun hab ich aber das Problem, dass wenn er das Keyword findet, genau eine Zeile tiefer in dem Textfile springen soll, quasi Zeile +1 um da ein Keyword zu suchen, was auf das andere folgt.
z.B.:
Das Keyword ist Autohaus und eine Zeile darunter ist das nächste Keyword: AnzAutos = 5.
Dieses AnzAutos = 5 muss ich findet, da ich die Zahl 5 für den weitern ablauf meines Programms benötige.
Nun habe ich aber keine Ahnung, wie ich das mit Hilfe meines schon bestehenden Codes erweitere.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()); } }Ich wäre für eure Hilfe äußerst dankbar:)
Grüße
TheRod
-
Nach dem getline() steht der Lesezeiger schon auf dem Anfang der nächsten Dateizeile. Jetzt mußt du diese Zeile nur noch einlesen und auseinandernehmen, um an die 5 heranzukommen.
-
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