Retirer les doublons d'un document texte

Signaler
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005
-
 green mamba -
salut a tous je dois faire un petit programme en c++ mais je suis pas tres douer:

j'ai un fichier texte sous la forme suivante:

203.125.118.17
217.215.120.3
203.126.140.67
213.115.128.94
210.126.140.27
207.126.125.16
69.1.32.175
217.215.120.3
69.1.32.25
217.215.120.3
203.127.221.98
...( +- 6500 lignes)

ce fichier texte contient de doublons(lignes répétées,non consécutives)

mon programme consiste a faire un autre document texte sans les doublons

ca n'a pas l'ai compliqué mais je sais pas du tout comme m'y prendre...

merci

54 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
T'as deja posé la question ya pas longtemps, et c'est résolu
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

ah bon???

et ou ca??
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Oh désolé c'était pas toi, mais une question similaire est présente peu avant:
http://www.cppfrance.com/forum.v2.aspx?ID=318226&nb=6
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

ca m'aide pas vraiment car je sais meme pas comment il faut lire le document

ps si ca tien en 10 ligne(dit dans l'autre post)

pk pas nous les donner?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ca trie toto.txt et supprime les doublons, resultat sur stdout

apres tu mets ca en forme comme tu veux

#include
#include
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
ifstream file( "toto.txt" );

string line;
vector< string > lines;
while( getline( file, line ) )
lines.push_back( line );

sort( lines.begin(), lines.end() );

for( vector< string >::iterator i = lines.begin() + 1; i < lines.end(); ++i )
if( *i == *(i - 1) )
i = lines.erase( i ) - 1;

for( vector< string >::size_type i = 1; i < lines.size(); ++i )
cout << lines[i] << '\n';
}
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

merci mais j'ai les erreurs suivantes quand je veux compiler

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Cpp1.cpp(24) : error C2040: 'i' : 'unsigned int' differs in levels of indirection from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *'
C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Cpp1.cpp(24) : error C2446: '<' : no conversion from 'unsigned int' to 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Cpp1.cpp(24) : error C2040: '<' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' differs in levels of indirection from 'unsigned int'
C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Cpp1.cpp(26) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
j'imagine que tu es sous vc++ 6 ?

prends un vrai compilo, devcpp est gratuit
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

ok
je prends
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
dev cpp n'est pas un compilo, donc pas non plus un vrai compilo. Sous windows, préfère quand même le compilateur de Visual C++ qui est gratuit.
En fait VC++ ne respecte pas les règles de portée du for, les variables déclarées dedans (ici i) restent déclarées après, donc pour le deuxieme for, utilise un autre identificateur (l'option /Zc:forScope permet de régler ce probleme)
En tous cas je compile très bien l'exemple de djl avec VC++ 7.1
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

j'ai quand meme une erreur...

2 C:\Documents and Settings\akwell\Mes documents\c++\tri ip\2 unable to run program file.

Compiler: Default compiler
Executing g++.exe...
g++.exe "C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Untitled1.cpp" -o "C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Untitled1.exe" -I"C:\Dev-Cpp\include\c++\3.3.1" -I"C:\Dev-Cpp\include\c++\3.3.1\mingw32" -I"C:\Dev-Cpp\include\c++\3.3.1\backward" -I"C:\Dev-Cpp\lib\gcc-lib\mingw32\3.3.1\include" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
Execution terminated
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
pas d'erreur donc l'executable est bien produit
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

les gars je suis debutant donc si vous pouviez etre plus explicite ca serait sympa
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
je sais pas,

regardes si

C:\Documents and Settings\akwell\Mes documents\c++\tri ip\Untitled1.exe

à été généré
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

non
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

Je ne vois pas d'erreurs la dedans, c'est la commande de compilation.
Execution terminated ? peut tu lire la sortie standard ?

Sinon, quelques corrections minimes sur le code de djl :(ça ne devait pas compiler sinon)

#include
#include
#include <fstream>
#include <string>
//#include <vector>
#include <list>

using namespace std;

int main()
{
ifstream file( "toto.txt" );

string line;
list< string > lines;
while( getline( file, line ) )
lines.push_back( line );

//sort( lines.begin(), lines.end() ); //correct cependant
lines.sort() //spécifique à list

//for( list< string >::iterator i = lines.begin() + 1; i < lines.end(); ++i )
//if( *i == *(i - 1) )
//i = lines.erase( i ) - 1;
lines.unique();

for( list< string >::const_iterator cit = lines.begin(); cit != lines.end(); ++cit )
cout << *cit << endl;

return 0;
}

lines.erase(i) n'est pas faisable avec vector, il me semble ... ça aurait fait une erreur à la compil normalement.
Messages postés
47
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
19 juin 2005

j'ai bien une erreur a la ligne lines.unique();
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
si plus_plus_fab, la stl a évolué, il n'y a rien d'incorrect dans ma version vector, ca compile sous g++ 3.2

avec le erase, faut juste faire gaffe a metre a jour l'iterateur
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Moi je n'ai aucun probleme, que ce soit avec gcc ou avec vc++

C:\MinGW\bin\g++.exe doublon.cpp
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
mais ta version avec list me plait mieux, c'est encore plus cour

apres faut voir ce que ca donne niveau perf
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
de toute facon la stl est tellement riche qu'il y a plusieurs facons de faire, j'avais deja commencer avec un remove_if...