Ausgabe eines Wortes



  • Hallo ihr fleißigen Helfer,
    ich hole mir öfter mal Anregungen aus diesem Forum sei es für Office oder andere Dinge.
    Nun hab ich aber selber ein Problem in Visual C++(2003 Profesional).
    Ich habe diesen Quellcode, der einen Text nach einem bestimmten Wort durchsucht, was er dann in einer Listbox ausgibt.

    {
    
    	ifstream data("c:\\Test.txt"); 
    	string zeile;
    	CString word = "Es gibt dieses Wort nicht!!";
    	while(getline(data,zeile)) 
    	{ 
    		size_t pPosn = zeile.find("Wort"); 
    		if (pPosn!=string::npos) 
    		{ 
    				TRACE("gefunden Pos: %d - %s\n",pPosn,(zeile.substr(pPosn)+"?").c_str()); 
    				m_ctlLISTOUTPUT.AddString(zeile.substr(pPosn,4).c_str());
    
    		}
    		else 
    		{	
    				m_ctlLISTOUTPUT.AddString(word);
    
    		}	
              }
    }
    

    Als Dummy hab ich mir ein Textfile gebaut, wo in der einen Zeile Das Wort drin steht und in der nächsten nicht und das wiederholt sich ein paar mal.
    Also so:
    Wort
    Dieses Wort gibt es nicht
    Wort
    Dieses Wort gibt es nicht.

    Nun will ich das Programm aber so umschreiben, dass er nicht jede Zeile ausgibt, in der das Programm das Wort "Wort" gefunden hat, sondern er soll am Ende der Durchsuchungsphase das gefunde Wort nur einmal ausgeben, oder eben einmal sagen, dass es das Wort in dem Text nicht gibt.
    Allerdings habe ich dazu keine Ahnung, wie ich das Problem lösen kann.
    Ich bin für eure Hilfe sehr dankbar.

    Gruß
    Peter



  • Ein break; in Zeile 13 sollte da genügen.
    Wenn nach der Schleife m_ctlLISTOUTPUT leer ist, kannst Du auch noch 'Nicht gefunden' ausgeben.



  • Danke,
    nun schreibt er das Wort "Wort" nur einmal heraus, egal wo es steht.
    Aber wo sag ich dem Programm, das wenn die Listbox leer ist, er:
    Das Wort gibt es nicht
    ausgeben soll.
    Mach ich das in der while-Schleife oder danach?

    Muss ich das dann so machen?

    if (m_ctlLISTOUTPUT == "")
    	{
    		m_ctlLISTOUTPUT.AddString(word);
    	}
    


  • Genau. Direkt nach der Schleife, also dorthin wo es auch nach dem break weitergeht. Allerdings gibt es sicher eine Methode ListBox.GetSize() o.ä. um die Anzahl der Elemente zu ermitteln, der Vergleich mit "" bringt nichts.
    Eine andere Möglichkeit wäre noch eine boolsche variable vor der Schleife zu definieren und auf false zu setzen, vor dem break setzt Du die auf true. Nach der Schleife kannst Du dann auf true oder false prüfen und die Ausgabe vornehmen.



  • So nun klappt das auch 🙂

    Hab das jetzt mit der boolschen Variable gemacht und es klappt so, wie ich es haben wollte.

    {
    
    	ifstream data("c:\\Test.txt"); 
    	string zeile;
    	CString word = "Es gibt dieses Wort nicht!!";
    	bool leer(false);
    	while(getline(data,zeile)) 
    	{ 
    		size_t pPosn = zeile.find("Mann"); 
    		if (pPosn!=string::npos) 
    		{ 
    				TRACE("gefunden Pos: %d - %s\n",pPosn,(zeile.substr(pPosn)+"?").c_str()); 
    				m_ctlLISTOUTPUT.AddString(zeile.substr(pPosn,4).c_str());
    				leer = true;
    
    				break;
    		}
    	}
    	if(leer == false)
    		{
    			m_ctlLISTOUTPUT.AddString(word);
    		}
    

    Vielen Dank für den Tip. Es hat mir echt weiter geholfen, das anhand deines Tips selbst herauszufinden.

    Grüße
    Peter


Anmelden zum Antworten