String: Finden und Ausgeben



  • drakon schrieb:

    knudy schrieb:

    Nexus schrieb:

    knudy schrieb:

    Aber wie mache ich das, dass er am Anfang komplett die ganze Datei einliest?! Mit ner Schleife?!

    Ja, solange in einer Schleife einlesen, bis du zu eof() kommst...

    und was für ne schleifenbedingung knall ich da rein?

    Na die Prüfung, ob eof gesetzt ist:
    http://www.cplusplus.com/reference/iostream/ios/eof/

    Hab ich nun aber es geht immer noch nicht 😞
    Sagt mir zwar keine Fehlermeldung aber er findet auch ncihts, obwohl in der ersten Zeile Tobias steht.

    fstream f;
    	string sAuslesen;
    	f.open("./adressbuch.txt", ios::in);
    
    	while (! f.eof())
    		{
    			getline(f, sAuslesen);		 
    		}
    
    	f.close();
    
    	string::size_type sGefunden = sAuslesen.find( "Tob", 0 );
    
    	if( sGefunden != string::npos ) 
    		cout << "Gefunden: " << sGefunden << endl;
          else 
           cout << "Nichts gefunden!" << endl;
    


  • knudy schrieb:

    Sagt mir zwar keine Fehlermeldung aber er findet auch ncihts, obwohl in der ersten Zeile Tobias steht.

    fstream f;
    	string sAuslesen;
    	f.open("./adressbuch.txt", ios::in);
    	
    	while (! f.eof())
    		{
    			getline(f, sAuslesen);		 
    		}
    
    	f.close();
    
    	string::size_type sGefunden = sAuslesen.find( "Tob", 0 );
    
    	
    	if( sGefunden != string::npos ) 
    		cout << "Gefunden: " << sGefunden << endl;
          else 
           cout << "Nichts gefunden!" << endl;
    

    Das ist das Problem. Es steht in der ersten Zeile, nicht in der letzten. Du liest alles Zeilen nacheinander jedesmal in die gleiche stringvariable, überschreibst sie also jedesmal. Das heißt das, was du am Ende analysierst ist die letzte Zeile.

    Pack entweder alle Zeilen nacheinander in einen Container oder analysiere jede Zeile innerhalb der Schleife.



  • Danke.
    Hat nun geklappt:

    while (! f.eof()) // Schleife weil er Zeile für Zeile einlesen muss. | eof = End of File
    		{
    			getline(f, sAuslesen);		
    			string::size_type sGefunden = sAuslesen.find( sSucheingabe, 0 );
    
    			if( sGefunden != string::npos ) 
    			{
    				string sAusgabe = sAuslesen.substr(sGefunden);
    				cout << "Gefunden: " << sGefunden <<" | Ausgabe: "<<sAusgabe<< endl;
    			}
    
    		}
    

    Aber nun möchte ich, dass wenn nichts gefunden wurde auch ein
    "Es wurde leider nichts gefunden"
    kommt.

    also else gehts nicht weil er sonst nach jeder Zeile (bei der er nichts findet) gleich nen else rauskloppt



  • Mach vor die Schleife eine bool-Variable (initial "false"), setze sie auf "true" wenn der String gefunden wurde und prüfe die Variable hinter der Schleife.



  • Badestrand schrieb:

    Mach vor die Schleife eine bool-Variable (initial "false"), setze sie auf "true" wenn der String gefunden wurde und prüfe die Variable hinter der Schleife.

    Wie meinst du das genau?

    Und noch ne kleine Frage:
    Wenn ich etwas finde, sagt er mir ja an welcher Stelle er es findet und liest die restliche Zeile aus.
    Wie mache ich das, dass wenn irgendwo was findet die komplette Zeile ausgibt auch wenn den "linken" Teil der gefundenen Stelle..

    Beispiel:
    Es wird nach "Pe" gesucht.

    Name: Peter Pan

    Er findet Pe und gibt Peter Pan aus

    Möchte aber das er komplett
    Name: Peter Pan ausgibt.



  • ok mit der ganze zeile auslesen habe ich nun gelöst bekommen.

    aber den bool-vorschlag hab ich noch nicht ganz verstanden.



  • Ich glaub er meint das so:

    bool found = false;
    while (! f.eof())
    {
       getline(f, sAuslesen);       
       string::size_type sGefunden = sAuslesen.find( sSucheingabe, 0 );
    
       if( sGefunden != string::npos )
       {
           string sAusgabe = sAuslesen.substr(sGefunden);
           cout << "Gefunden: " << sGefunden <<" | Ausgabe: "<<sAusgabe<< endl;
           found = true;
       }
    }
    if ( !found )
       cout << "Nix gefunden" << endl;
    


  • it0101@loggedoff schrieb:

    Ich glaub er meint das so:

    Glaub ich auch. Und ich weiß auch nicht recht, was daran unklar war..?



  • So alles wunderbar geklappt.
    DANKE!!!!

    Noch ne Frage:

    Also die Daten sind wie folgt in der .txt Datei gespeichert

    Name: hans
    Wohnort: Hamburg
    Alter: 34
    Tele: 3435343

    Name: paul
    Wohnort: muenchen
    Alter: 12
    Tele: 3434

    Name: hans
    Wohnort: Kiel
    Alter: 55
    Tele: 3423445435

    Nun möchte ich gerne - soweit es geht - dass wenn z.b. in der Suche nach "Kie" suche der komplette "Block" angezeigt wird:

    Name: hans
    Wohnort: Kiel
    Alter: 55
    Tele: 3423445435

    Zurzeit zeigt er mir ja die Suchergebnise nur immer die aktuelle ganze Zeile an!



  • Nimm ne Klasse, überlad den op>> und dann ists nur noch ein find und fertig bist du...

    bb


Anmelden zum Antworten