IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

supprimer redondance dans un fichier


Sujet :

C++

  1. #1
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut supprimer redondance dans un fichier
    bonjour, je travaille sur un générateur de mots , pour une langage donnée

    voici mon problème , j'ai pu construire un fichier qui contient tout les mots possibles pour ce langages mais avec redondances

    alors je veux savoir si quelqu'un a une fonction pour supprimer les redondances dans un fichier , sa va me facilité beaucoups la tache.
    merci

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Et bien commence déjà par trier les lignes de ton fichier par ordre alphabetique (des tas d'algo de tri sont dispo sur le net).

    Ensuite, si il y a des doublons, ils seront côte à côte et facile à éliminer.

  3. #3
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    le fichier est déja trier. j'ai volus gagné un peu de temps avec une fonction qui supprime les redondances , j'ai pas trouvé sur le net pour le c/c++

    pour d'autre langages oui

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par scofild20 Voir le message
    le fichier est déja trier. j'ai volus gagné un peu de temps avec une fonction qui supprime les redondances , j'ai pas trouvé sur le net pour le c/c++

    pour d'autre langages oui
    Ou veut tu supprime les redondances. Aprés lecture dans le fichier???
    tu utilise quoi pour stocker tes mot??
    Pour contenaire trié il existe l'algo std::unique
    Sinon mieux il exist le contenaire std::map

  5. #5
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    Ou veut tu supprime les redondances. Aprés lecture dans le fichier???
    tu utilise quoi pour stocker tes mot??
    le fichier je l'ai ouvert en "a+" , et c'est le fichier ou je stock mes mots

    c'est un simple fichier text

    Pour contenaire trié il existe l'algo std::unique
    Sinon mieux il exist le contenaire std::map
    je vais jeté un oeil sur ces algo. merci pour votre aide

  6. #6
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    biensur il faut crée un nouveau fichier pour mettre les mots sans redondances

    car le c/c++ ne permet pas la suppression des lignes

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par scofild20 Voir le message
    biensur il faut crée un nouveau fichier pour mettre les mots sans redondances

    car le c/c++ ne permet pas la suppression des lignes
    Tu pourrai aussi le faire en deux temps :
    1- tu lie ton fichier et remplie ta structure (par exemple une std::map<std::string,str::string>)
    2- tu réécrit ton fichier.

    En gros, viré une ligne dans fichier oblige la recopie de tout le fichier situé aprés la ligne a partir de cette ligne . C'est trés lent.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Heu j'ai un peu l'impression que vous vous compliquez la vie.

    Si le fichier est trié, on l'ouvre avec un ifstream, on stocke la premiere ligne dans un string, et pour chaque ligne suivante, si precedente == courante on ne fait rien sinon on la réécrit dans un autre fichier ouvert avec ofstream et on affecte la courante à la place de la précédente... On aura pris soin d'écrire la premiere ligne également.

    Enfin y a aucune difficulté là..

  9. #9
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    voice la structure du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    a
    a
    a
    a
    a
    a
    b
    b
    b
    b
    b
    b
    c
    c
    c
    c
    c
    c
    d
    d
    d
    d
    d
    d
    ab
    ab
    ad
    ad
    ab
    ab
    ba
    ba
    bc
    bc
    ba
    ba
    ca
    ca
    cd
    cd
    ca
    ca
    ba
    ba
    bc
    bc
    ba
    ba
    abc
    abd
    adb
    adc
    abc
    abd
    bad
    bac
    bca
    bcd
    bad
    bac
    cab
    cad
    cda
    cdb
    cab
    cad
    bad
    bac
    bca
    bcd
    bad
    bac

  10. #10
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    je veux dire qu'il peut exister des redondances au milieu du fichier , pas naicessairement s'il est triée

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par scofild20 Voir le message
    le fichier est déja trier.
    Citation Envoyé par scofild20 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    d
    d
    ab
    ab
    ad
    ad
    ab
    ab
    ba
    ba
    bc
    bc
    Citation Envoyé par scofild20 Voir le message
    je veux dire qu'il peut exister des redondances au milieu du fichier , pas naicessairement s'il est triée
    J'avoue avoir du mal a te comprendre.
    Tu nous dis que ton fichier est trié, tu nous montre un fichier pas trié, et enfin tu sors une phrase qui ne veux rien dire. Est-ce que tu t'en rends compte ?

    Désolé mais ce que tu cherches à faire est hyper simple, il s'agit d'une ouverture de fichier en lecture et une autre en ecriture en parallele, une boucle sur les lignes et un test.. Si tu ne vois pas avec les quelques indications que j'ai donné je ne sais pas ce que je peux faire de plus pour toi, à part te pondre le code ce que je me refuse à faire...

    C'est quand même le niveau zero de l'algorithmie là.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    J'avoue avoir du mal a te comprendre.
    Tu nous dis que ton fichier est trié, tu nous montre un fichier pas trié, et enfin tu sors une phrase qui ne veux rien dire. Est-ce que tu t'en rends compte ?

    Désolé mais ce que tu cherches à faire est hyper simple, il s'agit d'une ouverture de fichier en lecture et une autre en ecriture en parallele, une boucle sur les lignes et un test.. Si tu ne vois pas avec les quelques indications que j'ai donné je ne sais pas ce que je peux faire de plus pour toi, à part te pondre le code ce que je me refuse à faire...

    C'est quand même le niveau zero de l'algorithmie là.
    si il y as des doublons dans un fichier non trié, t'as méthode ne marchera pas.... il restera des doublon
    Sauf si tu grade en mémoire les donné déjà lu. Ce qui reviens a faire une lecture et une réécriture

  13. #13
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    Désolé mais ce que tu cherches à faire est hyper simple, il s'agit d'une ouverture de fichier en lecture et une autre en ecriture en parallele, une boucle sur les lignes et un test.. Si tu ne vois pas avec les quelques indications que j'ai donné je ne sais pas ce que je peux faire de plus pour toi, à part te pondre le code ce que je me refuse à faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    void supprimer_redondance(FILE *source, FILE *dest)
    {
         char *chaine,*chaine2;
         int existe=0;
         chaine=(char*)malloc(sizeof (char) * BUFSIZ);
         chaine2=(char*)malloc(sizeof (char) * BUFSIZ);
         rewind(source);
     
         while (fgets(chaine, BUFSIZ, source)!=NULL)
         {// on parcour le fichier source 
     
                existe=0;
                rewind(dest);//on place le pointeur du dest au débus après chaque tour while
               while(fgets(chaine2, BUFSIZ , dest)!= NULL ) 
                   if (strcmp(chaine, chaine2) ==0){ existe = 1;}
               // le pointeur dest va se placer au fin du fichier après le parcour
     
     
               if (existe==1) {  fputs(chaine, dest); }
     
     
     
     
     
         }
     
         free (chaine); free(chaine2);
     
     
    }
    il y as un problème dans la comparisation de chaine et chaine2

  14. #14
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    le fichier *dest , ne contient aucun mot

    et j'ai initialisé avec " startin.. " avans l'appel de la fonction supprimer_redondance afin que la fonction ne le traite pas comme un fichier vide et pour que la boucle while teste le fichier *dest
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(chaine2, BUFSIZ , dest )!= NULL )

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    ton code est du C.
    Tu devrait utiliser les string et les ifstream. ET un set

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     while(fgets(chaine2, BUFSIZ , dest)!= NULL ) 
     
    if (existe==1) {  fputs(chaine, dest); }
    Est tu sur que dest est ouvert en lecture / ecriture?
    Quand fgets(chaine2, BUFSIZ , dest) == NULL est tu sur que dest est invalidé et donc fputs ne fait rien??

  16. #16
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    http://cpp.developpez.com/faq/cpp/?page=fichiers section "Comment lire un fichier ligne par ligne" pourrait t'interesser.

    Effectivement, si ton fichier n'est pas trié, l'utilisation d'un std::set serait à envisager. Le set est une collection d'objet (dans notre cas se sera des std::string correspondant aux différentes lignes) uniques, trié automatiquement à chaque insertion. Si on ajoute deux objets identiques dans set, un seul subsiste.

    Donc la marche à suivre est :
    - ouverture du fichier en entrée (regarde mon lien)
    - lecture de chaque ligne et ajout dans le std::set
    - ouverture du autre fichier en sortie
    - pour chaque string dans le set on écrit dans le fichier + std::endl

    et c'est tout

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    http://cpp.developpez.com/faq/cpp/?page=fichiers section "Comment lire un fichier ligne par ligne" pourrait t'interesser.

    Effectivement, si ton fichier n'est pas trié, l'utilisation d'un std::set serait à envisager. Le set est une collection d'objet (dans notre cas se sera des std::string correspondant aux différentes lignes) uniques, trié automatiquement à chaque insertion. Si on ajoute deux objets identiques dans set, un seul subsiste.

    Donc la marche à suivre est :
    - ouverture du fichier en entrée (regarde mon lien)
    - lecture de chaque ligne et ajout dans le std::set
    - ouverture du autre fichier en sortie
    - pour chaque string dans le set on écrit dans le fichier + std::endl

    et c'est tout
    +1
    et en utilisant std::copy et un ostream_iterator.
    T'aura un code trop class

  18. #18
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    merci pour vos aides ,

    je vais allé lire la FAQ

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Juste pour te montrer ce que cela donnerai avec les algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void supprimer_redondance(std::ifstream &fin, std::ofstream  &fout)
    {	
    std::set<std::string> mySet;
    //lecture du fichier mot à mot et insertion dans le set pour enlever les doublons
    std::copy(std::istream_iterator<std::string>(fin), std::istream_iterator<std::string>(),std::inserter(mySet,mySet.begin()));
    //ecriture dans le fichier de sortie. Les doublons on disparue!!!
    std::copy(mySet.begin(), mySet.end(),std::ostream_iterator<std::string>(fout,"\n"));
    //pour vider le buffer
    fout.flush();
    }
    N'hésite pas à poser des questions.

  20. #20
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Par défaut
    bah mon devc++ me signale bq des erreurs genre
    set is not a member of std

    j'ai mis
    les bibliothèques :
    #include <fstream>
    #include <iostream>
    #include <sstream>

    ton code a besoin d'autres bibliothèques ??

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. probleme supprimer redondance dans un fichier
    Par Isabella83 dans le forum C
    Réponses: 5
    Dernier message: 06/02/2013, 11h07
  2. Controle de redondance dans un fichier txt en c++
    Par kabirou ousseini dans le forum C++
    Réponses: 3
    Dernier message: 27/04/2009, 22h44
  3. [Mysql] supprimer redondance dans réponse à une requête
    Par maverick56 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/05/2007, 14h29
  4. Supprimer ligne dans un fichier text
    Par Gad29 dans le forum Langage
    Réponses: 10
    Dernier message: 23/05/2007, 09h31
  5. Réponses: 3
    Dernier message: 20/09/2006, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo