Sortieren einer Textdatei



  • Hallo,

    ist es irgendwie möglich den Inhalt einer textdatei zu sortieren.
    Sprich man hat eine Datei und in jeder zeile srteht nur ein Owrt. Bsp:

    Hallo
    blub
    bla

    und das man das dann sortiert wieder in die selbe datei schreibt?

    Gruß



  • Klar. std::vectorstd::string, einlesen mit std::ifstream und operator >>, std::sort() über den Vektor, ausgeben mit std::ofstream und operator <<.


  • Mod

    cooky451 schrieb:

    Klar. std::vectorstd::string, einlesen mit std::ifstream und operator >>, std::sort() über den Vektor, ausgeben mit std::ofstream und operator <<.

    Ich kann das kürzer:
    std::multisetstd::string, einlesen mit std::ifstream und operator >>, ausgeben mit std::ofstream und operator <<.

    edit: Wäre performancetechnisch mal ein interessanter Vergleich. Dem vector mit seinen kleinen Konstanten traut man ja fast alles zu, aber der relativ teure Konstruktor und das relativ teure Kopieren von std::string könnten das kaputt machen, wobei eine gute Implementierung da vieles einsparen kann, da hier gemoved werden kann. Dahingegen macht das set keine unnötigen Aktionen wie Reallokieren oder nachträgliches Sortieren.
    (Und am Ende stellt sich raus, dass der Stream der Flaschenhals ist :p )



  • dankeschön 🙂

    fstream file;
      vector<string> text;
      vector<string>::iterator it;
      string bla;
      file.open(argv[1], ios::in);
    
      while (!file.eof())
      {
        getline(file, bla);
        text.push_back(bla);
      }
      file.close();
    
      sort(text.begin(), text.end());
    
      file.open(argv[1], ios::out);
    
      for (it = text.begin(); it != text.end(); it++)
        file << (*it) << endl;
    
      file.close();
    

    das funktioniert so. muss ich überhaupt 2 mal das file öffnen oder geht das auch mit einmal ?


  • Mod

    So ist schon ok. Was nicht ok ist, dass du die letzte Zeile doppelt liest (Was du vermutlich nicht merkst, weil sie leer ist). eof wird ein Stream erst dann, nachdem die letzte Leseaktion über das Ende hinweg lesen wollte.

    while (getline(file, bla))
        text.push_back(bla);
    

    Ist kürzer, richtig, und zudem auch noch gegen alle möglichen anderen Fehler gesichert, z.B. wenn die Datei gar nicht geöffnet werden konnte.



  • ah, verstehe. dankeschön 🙂


Anmelden zum Antworten