Dubletten löschen
-
Hallo Leute,
ich habe eine Textdatei, die sieht z.B. so aus:
11111
22222
33333
22222
55555
77777Nun will ich diese Datei einlesen, und die Dubletten löschen, und dann wieder abspeichern:
11111
22222
33333
55555
77777WIE KANN ICH DAS MACHEN?
Ich hatte mir mal in perl eine passende Routine geschrieben:
open(F1,"<infile") || die "FEHLER EINGANGSDATEI!"; my @liste =; close(F1); %seen = (); @listeneu = (); gesamt = 0;
$dups = 0;
foreach $item (@liste)
{ seen{item}) { seen{$item} = 1;
push (@listeneu, item); } else { dups++;
}
}
open (OUTFILE, ">$outfile") || die "DATEIFEHLER ! DATEI PRÜFEN!";
print OUTFILE @listeneu;
close (OUTFILE);NUR WIE MACHE ICH DAS IN C++
DANKE
polo
-
set<string> gefunden; string zeile; ifstream fin("In.txt");ofstream fout("Out.txt"); while(getline(fin,zeile)) { if(gefunden.find(zeile))continue; fout<<zeile<<endl; gefunden.insert(zeile); }
Oder eleganter (wenn dir die Reihenfolge nicht wichtig ist) - komplett einlesen, sortieren und mit unique_copy() schreiben.
-
zeilenweise einlesen, links und rechts trimmen
in einem set std::string einfügen und danach
eintrag für eintrag speichern.(Einträge in einen Set sind immer eindeutig,
Sortierung erfolgt über Operatoren von std::string)
-
Hallo,
was mache ich falsch, ich kann kein set erstellen.
Es kommt der Fehler ... 'set' : undeclared identifierAusserdem kommt bei "while(getline(fin,zeile)" ebenfalls ein Fehler. Ich kann es nur über fin.getline ansprechen...Irgendwas stimmt hier doch an meinen compilereinstellungen noch nicht!
DANKE!!!
-
polocpp schrieb:
Hallo,
was mache ich falsch, ich kann kein set erstellen.
Es kommt der Fehler ... 'set' : undeclared identifier#include <set> #include <string> #include <fstream> using namespace std;
-
#include <set> //dort steht die set drin #include <string> //für die getline() using namespace std;
^^ das gehört an den Anfang deiner CPP
-
AHA!
Das
#include <set>
hat mir noc hgefehlt.Jetzt klappt ja fast, nur warum kommt bei
gefunden.insert(zeile);
ein Fehler (es werden 3 Parameter benötigt??)DANKE!!
-
Keine Ahnung - normalerweise müsste der Compiler dort die 1-Parameter-Version "set<T>::insert(const T& val);" verwenden.
-
Hallo,
ich verzweifle mit meinem c++ compiler (MS Visual C++ 6.0)...
Ich habe nun folgendes Programm:
#include <set> #include <string> #include <fstream> using namespace std; int main() { set<string> gefunden; string zeile; ifstream fin("In.txt");ofstream fout("Out.txt"); while(getline(fin,zeile)) { if(gefunden.find(zeile)) continue; fout<<zeile<<endl; gefunden.insert(zeile); } return 0; }
Und dann bekomme ich folgenden Fehler:
h:\2005\settest\settest.cpp(17) : error C2451: conditional expression of type 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,classund dazu noch 6 warnings "warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>...."
WAS LÄUFT DENN HIER FALSCH???
-
CStoll (off) schrieb:
if(gefunden.find(zeile))continue;
vielleicht beschwert er sich über diese zeile?
if (gefunden.find(zeile) != gefunden.end()) continue;
-
GENAU !! DANKE!!
jetzt bekomme ich keinen Fehler mehr, und das Programm funktioniert wie gewünscht!
NUR: ich bekomme noch 100 warnings (in dem kleinen Programm!!)
Ich habe in http://support.microsoft.com/default.aspx?scid=kb;en-us;167355 gefunden das dies ein bekannter Bug von MS Visual C++ 6.0 ist! KANN DAS SEIN? WIE KANN ICH DIE MELDUNGEN DEAKTIVIEREN. Das nervt!DANKE!!!!
-
Hallo,
jetzt habe ich doch noch ein anderes Problem.
Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??DANKE
-
Hallo,
jetzt habe ich doch noch ein anderes Problem.
Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??DANKE
-
Das Problem habe ich jetzt selber hinbekommen:
while(getline(fin,zeile)) { i++; if (gefunden.find(zeile) != gefunden.end()) continue; ineu++; fout<<zeile<<endl; gefunden.insert(zeile); } dubeletten = i - ineu;
-
mit set gehts auch eleganter
set::insert gibt dir ein std::pair<iterator,bool> zurück.while(getline(fin,zeile)) { if ( gefunden.insert(zeile).second ) { ineu++; fout<<zeile<<endl; } i++; } dubeletten = i - ineu;
Kurt