Textdatei



  • Was soll er machen, wenn er das Wort gefunden hat?


  • Mod

    Bitte mehr Details.

    Falls es dir nur darum geht herauszufinden, welche Wörter in der datei stehen oder nicht, dann geht das beispielsweise sehr einfach mit std::set oder std::map. Wenn du aber noch andere Dinge mit dem Inhalt der datei vor hast, sind diese Datenstrukturen eventuell suboptimal und du könntest eher sowas wie std::vector oder std::list benutzen und dann std::find oder std::count auf diesen benutzen. Oder wenn du bloß ein einziges Wort suchst, dann kannst du auch gleich std::find oder std::search auf den istream-Iterator deiner Datei loslassen.

    Du siehst: Viele verschiedene Möglichkeiten, welche am passensten ist hängt davon ab, was die sonstigen Rahmenbedingungen deines Programms sein sollen.



  • Dravere schrieb:

    1. Eigeninitiative mit Code beweisen. Was hast du bisher schon versucht und gemacht? Wie hast du bisher eingelesen?
    2. Wie ist die Textdatei denn genau aufgebaut? Ein Wort pro Zeile? Oder steht da ein Text drin? Sonderzeichen? Sonstiges?

    Grüssli

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        char pcBuff[100];
    
    ifstream infile("test.txt");
    
    if ( !infile.is_open()) { 
    
         cout << "Fehler:Datei konnte nicht geöffnet werden\n"; 
    
    }
    
    else 
    cout << "Datei Gefunden!" << endl;
    
        while (! infile.eof()  )
    {
    
        infile.getline (pcBuff,6);
        cout << pcBuff << endl;
    
    }
    
    system("PAUSE");
    return 0;    
    }
    

    knivil schrieb:

    Was soll er machen, wenn er das Wort gefunden hat?

    soll er dann bsp sowas machen:

    cout << "Gefunden: " << Wort << endl;


  • Mod

    ali-g schrieb:

    ...snip...

    Ok, du hast die Datei also eingelesen in einen antiquierten C-Container. Zurück zur Eigeninitiative: Wie würdest du jetzt weiter vorgehen?

    edit: Ich sehe gerade, du hast sie ja gar nicht eingelesen. Du gibst sie bloß direkt aus. Also liegt das Problem woanders: Wie würdest du vorgehen, um das Eingelesene mit deinem Suchwort zu vergleichen, anstatt es auszugeben?



  • #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main() {
      ifstream in("test.txt");
      if(not in) {
        cerr << "Fehler beim öffnen von test.txt\n";
        return 1;
      }
      string word;
      while(in >> word) {
        if(word == "hallo") {
          cout << "Gefunden\n";
        }
        cout << word << '\n';
      }
    }
    


  • ich will jetzt eine Routine machen

    das er jetzt die ganze datei durch geht und nach

    ein wort sucht den ich mir aussuche bsp hallo

    z.b macht er sowas

    DIE DATEI Enthält die Wörter :

    hi
    wiegehts
    hus
    hallo

    er schaut dann alle wörter durch und vergleicht sie mit meiner
    falls richtig

    cout << "Gefunden: " << Wort << endl;

    -> falls falsch
    cout << "nicht Gefunden!" << endl;

    rüdiger schrieb:

    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main() {
      ifstream in("test.txt");
      if(not in) {
        cerr << "Fehler beim öffnen von test.txt\n";
        return 1;
      }
      string word;
      while(in >> word) {
        if(word == "hallo") {
          cout << "Gefunden\n";
        }
        cout << word << '\n';
      }
    }
    

    also

    wo du cout << word << '\n';

    ausgibst gibt es alle wörter aus statt nur das gefundene
    wieso es nur das wort ausgeben soll, weil z.b
    bei einer MD5 Hash vergleichungen.



  • #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    const std::string StringVectorFind(std::vector<std::string>::const_iterator BeginIterator,
    								   std::vector<std::string>::const_iterator EndIterator,
    								   const std::string Keyword) 
    {
    	for(; BeginIterator != EndIterator; ++BeginIterator)
    	{
    		if(Keyword == *BeginIterator)
    			return *BeginIterator;
    	}
    
    	return "Nix gefunden";
    }
    
    int main() 
    {
    	std::string line;
    	std::ifstream infile("test.txt", std::ios::in);
    	std::vector<std::string> Buffer;
    	std::vector<std::string>::const_iterator it(Buffer.begin());
    
    	if(!infile.is_open() || infile.fail()) std::cout<<"War nix -.-"<<std::endl;
    	else
    	{
    		while(!infile.eof())
    		{
    			getline(infile, line);
    
    			if(!line.empty()) Buffer.push_back(line);
    		}
    	}
    }
    

    (ungetestet)
    So, jetzt ist Eigeninitiative gefragt 😃



  • Kóyaánasqatsi schrieb:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    const std::string StringVectorFind(std::vector<std::string>::const_iterator BeginIterator,
    								   std::vector<std::string>::const_iterator EndIterator,
    								   const std::string Keyword) 
    {
    	for(; BeginIterator != EndIterator; ++BeginIterator)
    	{
    		if(Keyword == *BeginIterator)
    			return *BeginIterator;
    	}
    
    	return "Nix gefunden";
    }
    
    int main() 
    {
    	std::string line;
    	std::ifstream infile("test.txt", std::ios::in);
    	std::vector<std::string> Buffer;
    	std::vector<std::string>::const_iterator it(Buffer.begin());
    
    	if(!infile.is_open() || infile.fail()) std::cout<<"War nix -.-"<<std::endl;
    	else
    	{
    		while(!infile.eof())
    		{
    			getline(infile, line);
    
    			if(!line.empty()) Buffer.push_back(line);
    		}
    	}
    }
    

    (ungetestet)
    So, jetzt ist Eigeninitiative gefragt 😃

    wow dein code fällt mir jetzt echt schwer, so weit bin ich jetzt auch nicht
    in c++ :D:D

    also wenn ich es ausführen kommt rein garnichts, falls du mir den code
    bisschen eklärst?



  • ali-g schrieb:

    also

    wo du cout << word << '\n';

    ausgibst gibt es alle wörter aus statt nur das gefundene
    wieso es nur das wort ausgeben soll, weil z.b
    bei einer MD5 Hash vergleichungen.

    Das wirst du ja wohl selbst schaffen anzupassen.

    Der Code von Kóyaánasqatsi ist Blödsinn. Ignoriere den einfach.



  • rüdiger schrieb:

    ali-g schrieb:

    also

    wo du cout << word << '\n';

    ausgibst gibt es alle wörter aus statt nur das gefundene
    wieso es nur das wort ausgeben soll, weil z.b
    bei einer MD5 Hash vergleichungen.

    Das wirst du ja wohl selbst schaffen anzupassen.

    Der Code von Kóyaánasqatsi ist Blödsinn. Ignoriere den einfach.

    fallst du jetzt meinst dass ich einfach so machen soll

    cout << "hallo" << endl;

    dann hast du mich falsch verstanden

    weil stell dir vor du suchst ein password und hast nur den MD5 hash

    wenn du nur den MD5 hash hast weisst du ja nicht wenn er den gefunden hat
    welchen er in der liste meint, also wenn die in der liste keine MD5 hashs sind sondern normale wörter..bin grad voll verplant und weiß nicht wie ich das machen soll mit dem einen wort ausgeben.



  • Kóyaánasqatsi schrieb:

    #include <iostream>
    ...
    

    (ungetestet)
    So, jetzt ist Eigeninitiative gefragt 😃

    Ich finde den Code etwas unzweckmäßig. Warum erst die Zeilen lesen, dann diese abspeichern und anschließend wieder neu nach dem Wort durchsuchen. Dann doch gleich die Wörter lesen und gucken ob das gesuchte drin vorkommt:

    #include <algorithm> // std::find
    #include <fstream>
    #include <iostream>
    #include <iterator> // std::istream_iterator
    #include <string>
    
    int main()
    {
        using namespace std;
        ifstream file("input.txt");
        cout << (find( istream_iterator< string >( file ), istream_iterator< string >(), string("hallo") ) != istream_iterator< string >()?
            "gefunden": "nicht gefunden") << endl;
        return 0;
    }
    

    .. dann muss man ali-g auch weniger erklären, was man da macht 😉

    Gruß
    Werner



  • also danke für dein code

    hast du vielleicht eine Idee wie ich das Originale "hallo"

    aus der datei ausgeben könnte bzw. das Originale gefundene Wort(aus der datei) ausgeben könnte ??

    fallst du dir fragst wöfür ich das brauche weil ich das wort selber schon weiß kann ich dir gerne eklären wofür



  • rüdiger schrieb:

    Der Code von Kóyaánasqatsi ist Blödsinn. Ignoriere den einfach.

    Warum sollte er Blödsinn seien? o0 Andere Dinge wird er nicht raffen (siehe Werner's post).



  • ok ihr c++ profis passt schon streitet euch nicht 😃 ich brauch nur noch womit ich
    das originale gefundene wort ausgeben kann ?

    fallst jemand eine eklärung braucht wofür ich das brauche weil ich das wort ja schon hab, dann eklär ich das .


  • Administrator

    Kóyaánasqatsi schrieb:

    rüdiger schrieb:

    Der Code von Kóyaánasqatsi ist Blödsinn. Ignoriere den einfach.

    Warum sollte er Blödsinn seien? o0 Andere Dinge wird er nicht raffen (siehe Werner's post).

    Naja:
    1. Der Code ist falsch, du liest die letzte Zeile doppelt ein.
    2. Dein Code ist genauso komplex, nur verwendest du ein paar zentrale Funktionen nicht, welche die Sache eigentlich eher vereinfachen würden.
    3. Es hat ein paar Dinge drin, welche zwar nicht falsch sind, aber einfach unnötig.

    ali-g schrieb:

    fallst jemand eine eklärung braucht wofür ich das brauche weil ich das wort ja schon hab, dann eklär ich das .

    Jap, das brauch ich, sonst macht es für mich 0, Null, Zero, Non, Nullo Sinn 😉

    Grüssli



  • Dravere schrieb:

    1. Der Code ist falsch, du liest die letzte Zeile doppelt ein.
    2. Dein Code ist genauso komplex, nur verwendest du ein paar zentrale Funktionen nicht, welche die Sache eigentlich eher vereinfachen würden.
    3. Es hat ein paar Dinge drin, welche zwar nicht falsch sind, aber einfach unnötig.

    Ok, könntest du den entsprechenden Code bitte berichtigen?



  • ali-g schrieb:

    fallst du dir fragst wöfür ich das brauche weil ich das wort selber schon weiß kann ich dir gerne eklären wofür

    schöner Satz - sollte mach sich irgendwie archivieren 😉

    Also wenn ich das alles mal zusammenfasse, so suchst Du nicht ein bestimmtes Wort, sondern ein Wort, was irgendeine Eigenschaft (MD5?) erfüllt, und dieses Wort möchtest Du dann auch ausgegeben haben. Dann erweitere ich den Code mal etwas:

    #include <algorithm> // std::find_if
    #include <fstream>
    #include <iostream>
    #include <iterator> // std::istream_iterator
    #include <string>
    
    struct GuckMal
    {
        bool operator()( const std::string& wort ) const
        {
            // hier wird geprüft ob das Wort 'wort' das richtige ist,
            // falls ja, dann return true; sonst return false;
            if( wort[0] == 'h' && wort[wort.length()-1] == 'o' ) // z.B. vorne 'h' und hinten 'o'
                return true; // Ja das isses
            return false; // Nee noch mal versuchen
        }
    };
    
    int main()
    {
        using namespace std;
        ifstream file("input.txt");
        istream_iterator< string > i 
            = find_if( istream_iterator< string >( file ), istream_iterator< string >(), GuckMal() );
        if( i != istream_iterator< string >() )
            cout << "gefunden: " << *i << endl;
        else
            cout << "nix gefunden" << endl;
        return 0;
    }
    

    kommen wir der Lösung näher?



  • also ich eklär es euch mal wofür ich dass z.b brauchen könnte

    sagen wir mal du hast ein MD5 hash ok

    bsp das

    598d4c200461b81522a3328565c25f7c ( ich sag später mit welches wort der md5 hash generiert worden ist )

    so
    dann hab ich eine datei
    wo die wörter drinn stehen

    hi
    hallochs
    hallo
    kakalake

    die wörter stehen drinn

    also theoretisch geht dann das Programm jedes einzelne wort durch generiert
    ein MD5 hash von jeden einzelnen Wort und schaut ob das mit den obigen MD5 Hash übereinstimmt
    ok in diesem fall ist

    hallo richtig

    ok also so

    eingabe = 598d4c200461b81522a3328565c25f7c

    hallo -> MD5Hash == eingabe

    cout << "Richtig ist: " << Wort << endl;

    in diesem Fall ist dann Wort "hallo"



  • Juhee! - richtig geraten! dann lass' mich den Code noch etwas spezialisieren

    #include <algorithm> // std::find_if
    #include <fstream>
    #include <iostream>
    #include <iterator> // std::istream_iterator
    #include <string>
    
    // eine Funktion, die den md5-Code von 'wort' erzeugt
    std::string md5( const std::string& wort )
    {
        if( wort == "hallo" )
            return "598d4c200461b81522a3328565c25f7c";
        return "???"; //ich weiß nicht, wie md5 geht
    }
    
    struct GuckMal
    {
        GuckMal( const std::string& md5_code ) : m_md5_code( md5_code ) {}
        bool operator()( const std::string& wort ) const
        {
            // hier wird geprüft ob das Wort 'wort' das richtige ist,
            // falls ja, dann return true; sonst return false;
            return md5( wort ) == m_md5_code;
        }
    private:
        std::string m_md5_code;
    };
    
    int main()
    {
        using namespace std;
        string md5_code;
        cout << "eingabe = ", cin >> md5_code;
        ifstream file("input.txt");
        istream_iterator< string > i 
            = find_if( istream_iterator< string >( file ), istream_iterator< string >(), GuckMal( md5_code ) );
        if( i != istream_iterator< string >() )
            cout << "Richtig ist: " << *i << endl;
        else
            cout << "nix gefunden" << endl;
        return 0;
    }
    

  • Administrator

    @Kóyaánasqatsi,
    Korrektur ist fast nicht möglich, der würde am Ende komplett anders aussehen 😉
    Aber ich kann dir gerne mal die Codezeilen und co aufzeigen:
    1. Du rufst gar nicht StringVectorFind auf.
    2. Wozu diese Funktion überhaupt? Es gibt std::find ! Da verschwinden dann sogar diese komplizierten Typangaben, da diese automatisch gefunden und verwendet werden.
    3.

    std::ifstream infile("test.txt", std::ios::in);
    

    Das std::ios::in ist unnötig. Ist der Defaultwert bei std::ifstream .
    4.

    std::vector<std::string>::const_iterator it(Buffer.begin());
    

    Wozu diese Zeile? Nach dem ersten push_back ist it wieder ungültig. Zudem verwendest du die Variable gar nie.
    5.

    if(!infile.is_open() || infile.fail()) std::cout<<"War nix -.-"<<std::endl;
    

    Nicht nur das die Formatierung unschön ist, sondern die Abfrage kann auch viel einfacher passieren:

    if(!infile)
    {
      // ...
    }
    
    while(!infile.eof())
    

    std::istream::eof() prüft nur, ob du über das Ende hinaus gelesen hast und nicht, ob du am Ende bist. Dadurch kannst du am Ende sein und du führst nochmals ein std::getline aus, welches fehl schlägt, aber line ist wahrscheinlich trotzdem noch, von der vorherigen Zeile befüllt. Dadurch fügst du die letzte Zeile ein zweites Mal ein.
    Zudem ist es kein wortweise einlesen sondern zeilenweise.

    @Werner Salomon,
    Puh, danke. Dachte schon, dass ich nun noch etwas dem ali-g hinschreiben müsste, aber in der Vorschau gesehen, dass du die kompetente Hilfe übernommen hast 🙂

    Grüssli


Anmelden zum Antworten