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


Anmelden zum Antworten