problem mir einer schleife, mehr c++ als Qt
-
irgendwie find ich nicht so recht den fehler!
angenommen dass ist jetzt meine liste, die ich einlesen will:/*Standard*/ #HQ# Waaghboss 60 Bosse 20 Mekz 10 Dokz 10 Big Mek 25 Bossdok 25 Cyborks 13 #Elite# Stormboyz 15 Kommandoz 10 Panzaboyz 12 Skarboyz 11 Posaz 9 ...
dann soll:
Waaghboss 60 Bosse 20 Mekz 10 Dokz 10 Big Mek 25 Bossdok 25 Cyborks 13
ausgegeben werden.
aber leider gibt er nur genau jeden 3. aus. also
Waaghboss 60 Dokz 10 Cyborks 13
ich weiß dass das hier vielleicht nicht so recht passt, aber ich wette im c++ forum wundern sich die meisten wegen den funktionen...
mein problem ist, dass ich mich nicht so recht in die schleifen denken kann...
könnte mir jemand kurz sagen wo mein fehler ist?enum wh40kUnitType { hq = 1, elite = 2, sturm = 3, standard = 4, approvement = 5, all = 0 }; QStringList read_list(QString name, QString path, wh40kUnitType uType = all) { QFile *file = new QFile(path + name); QTextStream *txt_strm = new QTextStream(file); QStringList str_lst; if(file->open(QIODevice::ReadOnly)) std::cout<<"Datei konnte geoeffnet werden."<<std::endl; else std::cout<<"Datei konnte nicht geoeffnet werden."<<std::endl; if(file->isOpen() && file->isReadable() ) { std::cout<<"Datei kann gelesen werden."<<std::endl; if(uType == all) while(!txt_strm->atEnd() ) str_lst.append(txt_strm->readLine() ); if(uType == hq) { std::cout<<"Suche Bereich: "<<hq<<std::endl; while(!txt_strm->atEnd()) { if(txt_strm->readLine() == "#HQ#") { std::cout<<"Bereich: "<<hq<<" gefunden"<<std::endl; do { //temp_str = txt_strm->readLine(); str_lst.append(txt_strm->readLine() ); if((txt_strm->readLine() ).contains("#")) break; } while(!(txt_strm->readLine() ).contains("#") ); } } } } return str_lst; }
ich bin mir zu 90% sicher dass der fehler hier ist...
do { //temp_str = txt_strm->readLine(); str_lst.append(txt_strm->readLine() ); if((txt_strm->readLine() ).contains("#")) break; } while(!(txt_strm->readLine() ).contains("#") );
-
dg_enri schrieb:
while(!txt_strm->atEnd()) { if(txt_strm->readLine() == "#HQ#") { std::cout<<"Bereich: "<<hq<<" gefunden"<<std::endl; do { //temp_str = txt_strm->readLine(); str_lst.append(txt_strm->readLine() ); if((txt_strm->readLine() ).contains("#")) break; } while(!(txt_strm->readLine() ).contains("#") ); } }
Du hast in jedem Schleifendurchlauf drei readLine()-Aufrufe, die jeweils eine neue Zeile einlesen. Reduzier das lieber auf ein "QString line=txt_strm->readLine();" vor dem ersten if() und verwende anstelle der anderen Aufrufe jeweils den Inhalt von line.
-
Korrektur: Du hast sogar innerhalb der innersten do-while-Schleife drei readLine()-Aufrufe - die erste Zeile wird gespeichert, die zweite im if() ausgewertet, die dritte in der Abbruchbedingung der Schleife.
PS: if(...) break; als letzte Anweisung der Schleife ist etwas sinnlos - besonders wenn du dort die Abbruchbedingung nochmal prüfst.
-
so das funzt jetzt ganz gut. DANKE.
nur ein problem ist noch...if(line != "\n") str_lst.append(line);
damit will ich verhindern, dass zeilenumbrüche in die liste gepackt werden. aber es funktioniert nicht
if(uType == hq) { std::cout<<"Suche Bereich: "<<hq<<std::endl; while(!txt_strm->atEnd()) { QString line = txt_strm->readLine(); if(line == "#HQ#") { std::cout<<"Bereich: "<<hq<<" gefunden"<<std::endl; while(true) { line = txt_strm->readLine(); if(line.contains("#")) break; if(line != "\n") str_lst.append(line); } } } }
-
ein:
if(line != "")
funktioniert aus irgendeinem grund??!
-
Soweit ich weiss bekommt man bei einem readLine() keine \n in den Strings