doppelte Einträge entfernen



  • Hallo,

    mit dem Code möchte ich alle doppelten Einträge in einer Datei (zeilenweise)
    entfernen.

    int main() 
    {
    std::list<std::string> list;
    
    // Daten einlesen
    std::ifstream istr("mein_file.txt");
    while(!istr.eof())
    {
    std::string str;
    
    getline(istr, str);
    list.push_back(str);
    }
    istr.close();
    
    // liste sortieren und doppelte Einträge entfernen
    list.sort();
    std::unique(list.begin(),list.end());
    
    // Liste in die Datei schreiben
    std::ofstream ostr("mein_file.txt");
    for(std::list<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
    ostr << (*it) << "\n";
    }
    

    Als Testdatei gibt's nur vier Zeilen in "mein_file.txt"

    eins
    zwei
    drei
    vier

    Das Problem ist, dieses Programm lässt sich nur einmal ausführen. Bei jedem
    weiteren Ausführen wird ein neue Eintrag von "zwei" eingefügt, also wieder
    doppelte Einträge. Und zwar, die erste Zeile ist immer leer.

    Woran kann es liegen?

    Danke

    /edit: sfds



  • Weiß ich gerade auch nicht, aber du hast ein fehler drin:

    std::unique verändert nur die Reihenvolge innerhalb des Containers. Es gibt die die neue Endposition zurück:

    [cpp]
    std::liststd::string::const_iterator end = std::unique(list.begin(),list.end());

    // Liste in die Datei schreiben
    std::ofstream ostr("mein_file.txt");
    for(std::liststd::string::const_iterator it = list.begin(); it != end; ++it)
    ostr << (*it) << "\n";
    }
    [/cpp]



  • oder entfernen

    std::list<std::string>::const_iterator end = std::unique(list.begin(),list.end()); 
    
    list.erase(end, list.end());
    

Anmelden zum Antworten