Dateininhalte(Strings) sortieren



  • #include <iostream>
    #include <fstream>
    #include <list>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	list<string> wordlist;
    	list<string> shuffled;
    	list<string>::iterator it;
    	list<string>::iterator it2;
    	string tmp;
    	ifstream Wordlist("Wordlist.txt");
    	ifstream Shuffled("sffled.txt");
    
        while(!Shuffled.eof())
        {
            getline(Shuffled, tmp);
            shuffled.push_back(tmp);
        }
        while(!Wordlist.eof())
        {
            getline(Wordlist, tmp);
            wordlist.push_back(tmp);
        }
    
        for(it=shuffled.begin(); it!=shuffled.end(); it++)
        {
            for(it2=wordlist.begin(); it2!=wordlist.end(); it2++)
            {
                if((*it) == (*it2))
                {
                    cout << *it << endl;
                }
            }
        }
    
    	return 0;
    }
    

    So in etwa?
    Wegen sortieren: hatte vergessen zu schreiben, dass die Zeichen der Wörter einer Datei vermischt sind. Wollte die Wörter deshalb sortiert vergleichen.
    Danke dir



  • Prüfe nicht auf eof, sondern teste ob der Status good() ist.
    Eof schließst keine anderen Streamfehler mit ein.



  • Am Besten einfach den Rückgabewert von getline testen:

    while(getline(Shuffled, tmp))
        {
            shuffled.push_back(tmp);
        }
    


  • Danke, habe es geändert, aber:
    kann man also *it nicht benutzen, sondern muss sowas machen wie "wordlist[1].sort"? Wäre natürlich nicht so schön, da man nicht die Wörter zählen will. Muss doch noch eine andere Lösung geben?



  • std::string::sort() gbt es nicht!
    Du suchst http://www.cplusplus.com/reference/algorithm/sort/



  • ibdwnm schrieb:

    Danke, habe es geändert, aber:
    kann man also *it nicht benutzen, sondern muss sowas machen wie "wordlist[1].sort"? Wäre natürlich nicht so schön, da man nicht die Wörter zählen will. Muss doch noch eine andere Lösung geben?

    Mir leuchtet irgendwie nicht so ganz ein, wieso Du die Zeichen der Wörter sortieren willst. Das würde dazu führen, das z.B. der Vergleich von "ein" und "nie" Gleichheit liefert, was ja nicht wirklich stimmt.



  • Dann bräuchte ich einen Start- und einen Endwert. Das geht also nur bei Zahlen?
    Ich will die sortieren, da mir keine bessere Möglichkeit einfällt, ein unsortiertes Wort mit einem sortiertem zu Vergleichen. Wenn ich bei dem unsortierten alle Zusammensetzungen ausprobiere ist das Ergebnis ja auch das gleiche. Ist ja unmöglich zu wissen, ob das unsortierte Wort früher mal ein oder nie war.



  • ibdwnm schrieb:

    Dann bräuchte ich einen Start- und einen Endwert. Das geht also nur bei Zahlen?
    Ich will die sortieren, da mir keine bessere Möglichkeit einfällt, ein unsortiertes Wort mit einem sortiertem zu Vergleichen. Wenn ich bei dem unsortierten alle Zusammensetzungen ausprobiere ist das Ergebnis ja auch das gleiche. Ist ja unmöglich zu wissen, ob das unsortierte Wort früher mal ein oder nie war.

    Was soll denn ein "sortiertes Wort" sein. Wozu soll es gut sein, Wörter zu sortieren? Was soll ein Start- und ein Endwert in diesem Zusammenhang sein?
    Vielleicht beschreibst Du mal exakt, was Du überhaupt erreichen willst. Zumindest mir ist das überhaupt nicht klar.
    Wenn Du tatsächlich nur die Schnittmenge gleicher Worte aus zwei Dateien (so hatte ich das am Anfang verstanden) haben willst, dann muss nichts sortiert werden. Die Worte schon mal gar nicht.



  • Mit Anfangs-und Endwert meinte ich, dass dieses sort "http://www.cplusplus.com/reference/algorithm/sort/" einen Anfangs- und Endwert benötigt.
    Ich habe 2 Dateien, in jeder Zeile steht ein Wort. In der einen Datei sind normale Wörter, in der anderen sind durchgewürfelte. Diese will ich miteinander vergleichen und die gleichen ausgeben. Um rauszufinden, welche gleich sind, wollte ich die Wörter beider Dateien sortiert vergleichen.



  • Dann musst du aber nicht die Wörter (also deren Buchstaben) sortieren, sondern die Wortlisten. Wen du die Wörter beispielsweise in einem vector<string> v hast, geht das mit sort(v.begin(), v.end()); .



  • ibdwnm schrieb:

    Mit Anfangs-und Endwert meinte ich, dass dieses sort "http://www.cplusplus.com/reference/algorithm/sort/" einen Anfangs- und Endwert benötigt.
    Ich habe 2 Dateien, in jeder Zeile steht ein Wort. In der einen Datei sind normale Wörter, in der anderen sind durchgewürfelte. Diese will ich miteinander vergleichen und die gleichen ausgeben. Um rauszufinden, welche gleich sind, wollte ich die Wörter beider Dateien sortiert vergleichen.

    Wenn es durchgewürfelte "Wörter" sind, dann sind es keine Wörter mehr. Wörter sind nur dann Wörter, wenn die Syntax korrekt ist.
    Sonst sind es Zeichenfolgen. Du willst nicht die Schnittmenge gleicher Wörter zweier Dateien bilden, sondern die Schnittmenge gleicher Zeichenfolgen, wobei die Reihenfolge der Symbole jeder Zeichenfolge egal sein soll. Wenn es Dir doch um Wörter geht, dann darf da nichts durchgewürfelt sein.

    Beispiel:
    nie ist nicht das gleiche Wort wie eni . Man kann aber aus beiden die gleiche sortierte Zeichenfolge ein bilden. Nur der Wortsinn geht dabei verloren ( ein und nie sind offensichtlich nicht das gleiche Wort).



  • Der folgende Code (ungetestet) sollte alle Wörter aus "words.txt" in der Konsole ausgeben, deren sortierte Zeichenfolgen mit den sortierten Zeichenfolgen aus "scrambled_strings.txt" übereinstimmen.

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <set>
    #include <algorithm>
    #include <iterator>
    
    int main()
    {        
        std::set<std::string> scrambled_set;
        {
            std::ifstream reader("scrambled_strings.txt");
            std::string line;
            while(std::getline(reader, line))
            {
                std::sort(line.begin(), line.end());
                scrambled_set.insert(line);
            }
        }
    
        std::vector<std::string> word_list;
        {
            std::ifstream reader("words.txt");
            std::string line;
            while(std::getline(reader, line))
            {
                std::string word(line);
                std::sort(line.begin(), line.end());
                if(!scrambled_set.insert(line).second)
                {
                    word_list.push_back(word);
                }
            }
        }
    
        std::copy
            ( word_list.begin()
            , word_list.end()
            , std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    

    Was die Dinge im Einzelnen tun, kannst Du wiederum in der C++-Referenz nachlesen, welche Du oben bereits wegen sort verlinkt hattest.


Anmelden zum Antworten