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 :

suppression de doublon


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut suppression de doublon
    Bonsoir
    j'ai concu un programme c qui permet de lire un fichier,de supprimer les doublons (les doubles)
    mais il y a des problèmes lors de la lecture des pointeurs
    est ce que vous pouvez m'indiquez les erreurs

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include<stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
     
     
    int main() 
    { 
    FILE* fichier = NULL; 
    FILE * sortie; 
     
     
     
    int i=0; 
    int k=0; 
    int l=0; 
    int m=0; 
    int indexNewTab=0; 
    int n=0; 
    char * chaine=0; 
    char chaine1; 
    char chaine2; 
    char * tab[2000]; 
    char * newTab[2000]; 
    typedef enum { FAUX, VRAI } BOOL; 
     
    BOOL monBolleen; 
     
     
    int j=0; 
     
     
    fichier = fopen("k","r"); 
    sortie = fopen("l", "w"); 
     
    if (fichier!=NULL) 
     
    do 
     
    { 
    fgets(chaine,100,fichier); 
     
     
    tab[i]=chaine; 
     
     
    for (m=0;m<i;m++) 
    { 
    chaine1= * tab[m]; //permet de stocker le mot pour comparer ensuite
     
    monBolleen = FAUX ; 
    for (n=m;n<=i;n++) 
    { 
    chaine2=* tab[n]; 
     
    if (chaine2 == chaine1) 
    monBolleen = VRAI ; 
    } 
    if(!monBolleen) 
    *newTab[indexNewTab] =*tab[m]; 
    indexNewTab++; 
    } 
     
     
     
    fputs(newTab[indexNewTab],sortie); //sortie vers le fichier sortie
     
    printf("%s",tab[m] ); 
    // On lit le caractère 
    // On l'affiche 
     
     
    i=i+1; 
    } while (!feof(fichier) && chaine!="</DOC>"); // On continue tant que  n'a pas retourné EOF (fin de fichier) 
    j++; 
     
    } 
     
     
     
    fclose(fichier); 
    fclose(sortie);
    merci de votre aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    Bonsoir
    j'ai concu un programme c qui permet de lire un fichier,de supprimer les doublons (les doubles)
    mais il y a des problèmes lors de la lecture des pointeurs
    est ce que vous pouvez m'indiquez les erreurs

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include<stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
     
     
    int main() 
    { 
    FILE* fichier = NULL; 
    FILE * sortie; 
     
     
     
    int i=0; 
    int k=0; 
    int l=0; 
    int m=0; 
    int indexNewTab=0; 
    int n=0; 
    char * chaine=0; 
    char chaine1; 
    char chaine2; 
    char * tab[2000]; 
    char * newTab[2000]; 
    typedef enum { FAUX, VRAI } BOOL; 
     
    BOOL monBolleen; 
     
     
    int j=0; 
     
     
    fichier = fopen("k","r"); 
    sortie = fopen("l", "w"); 
     
    if (fichier!=NULL) 
     
    do 
     
    { 
    fgets(chaine,100,fichier); 
     
     
    tab[i]=chaine; 
     
     
    for (m=0;m<i;m++) 
    { 
    chaine1= * tab[m]; //permet de stocker le mot pour comparer ensuite
     
    monBolleen = FAUX ; 
    for (n=m;n<=i;n++) 
    { 
    chaine2=* tab[n]; 
     
    if (chaine2 == chaine1) 
    monBolleen = VRAI ; 
    } 
    if(!monBolleen) 
    *newTab[indexNewTab] =*tab[m]; 
    indexNewTab++; 
    } 
     
     
     
    fputs(newTab[indexNewTab],sortie); //sortie vers le fichier sortie
     
    printf("%s",tab[m] ); 
    // On lit le caractère 
    // On l'affiche 
     
     
    i=i+1; 
    } while (!feof(fichier) && chaine!="</DOC>"); // On continue tant que  n'a pas retourné EOF (fin de fichier) 
    j++; 
     
    } 
     
     
     
    fclose(fichier); 
    fclose(sortie);
    merci de votre aide

    De grosses lacunes en C. La principale est qu'on ne peut pas manipuler des chaines et dire if (ch1 == ch2) ou autre élément de comparaison car en C, tu ne détiens que l'adresse du début de chaine.
    Et donc si tu veux comparer 2 chaines, tu dois boucler à partir de leurs adresses respectives et comparer leurs caractères. Idem pour copier une chaine dans une autre.
    Heureusement les programmeurs de la librairie ont créé des fonctions de manipulation dont strcmp() pour comparer et strcpy() pour copier qui font le travail mentionné plus haut.

    La seconde lacune c'est que tu peux pas stocker des datas dans "chaine" car cette variable n'est qu'un pointeur (une adresse). Soit tu modifies ton code et tu la définis comme un tableau char chaine[100] (puisque tu vas y stocker 99 caractères + \0), soit tu alloues de la mémoire (chaine=malloc) et ensuite tu peux y mettre des datas.

    Ensuite quand tu écris tab[x]=chaine, ben tu ne fais que recopier une adresse dans une autre. Et comme l'adresse "chaine" ne change jamais (ce n'est que son contenu qui change), ben tu obtiens en final un tableau de n pointeurs pointant tous vers la même zone mémoire. Il serait judicieux de bien s'exercer avec les pointeurs avant de vouloir tenter ce genre de traitement. Et si tu te trouves sur un unixlike, t'as à ta disposition la commande "uniq" qui fait déjà ce travail.

    Accessoirement, la fonction feof() ne fait pas ce que tu crois. Elle ne détecte pas la fin d'un fichier. elle t'indique, une fois que le fichier a été lu, si la fin de lecture a été provoquée par une fin de fichier ou une erreur.
    Si tu veux boucler dans une lecture de fichier, il te faut simplement tester la fonction de lecture elle même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fgets(chaine, 100, fichier) != NULL)
    {
        // Traitement de la chaine
    }
    // Ici le fichier a été lu
    fclose(fichier);
    Dernier détail: généralement on définit ses types "t_qqchose" et on laisse les majuscules aux macro => typedef enum {faux=0, vrai=!0} t_bool;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    bonjour
    merci pour l'aide.
    je vais m'y mettre et essayer de résoudre toutes ces lacunes
    mais s'il y a encore de l'aide ,j'attends car j'en ai vraiment besoin


    pour la lecture du fichier et le stockage de son contenu dans le tab[i][j]
    et l'affichage,ca marche sans faute
    mais quand j'ai ajouté la partie de suppression de doublon ca bloque
    merci à tous

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    je vais m'y mettre et essayer de résoudre toutes ces lacunes
    mais s'il y a encore de l'aide ,j'attends car j'en ai vraiment besoin
    Une bonne aide serait que tu prennes un bon tutoriel programmation C et que tu le lises tranquillement


    Citation Envoyé par africanwinners Voir le message
    pour la lecture du fichier et le stockage de son contenu dans le tab[i][j]
    et l'affichage,ca marche sans faute
    Méfies-toi du "ça marche". Parce que même dans un programme mal écrit, ça peut quand-même marcher un temps. Puis on rajoute un printf() et là, ça marche plus. C'est ce qu'on nomme le "comportement indéterminé" et ça se produit à chaque instruction pouvant être illégale (style remplir un pointeur non alloué)

    Tu peux me dire quel est ton but ? Supprimer simplement les lignes en double dans un fichier c'est ça ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    merci pour l'aide précieuse

    donc l'objectif c'est de lire un fichier de cette forme
    <DOC 1>
    le
    soir
    le
    soir
    ...
    </DOC>
    <DOC 2>
    samedi
    bonjour
    samedi
    bonjour
    ...
    </DOC>
    je lis chaque <DOC n> séparemmment et j'enlève les doubles
    voila le résultat
    par exemple
    <DOC 1>
    le
    soir
    ...
    </DOC>
    <DOC 2>
    samedi
    bonjour
    ...
    </DOC>
    ...
    merci pour l'aide

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    merci pour l'aide précieuse

    donc l'objectif c'est de lire un fichier de cette forme
    <DOC 1>
    le
    soir
    le
    soir
    ...
    </DOC>
    <DOC 2>
    samedi
    bonjour
    samedi
    bonjour
    ...
    </DOC>
    ...
    je lis chaque <DOC n> séparemmment et j'enlève les doubles
    voila le résultat
    par exemple
    <DOC 1>
    le
    soir
    ...
    </DOC>
    <DOC 2>
    samedi
    bonjour
    ...
    </DOC>
    ...
    merci pour l'aide
    Ouch ça ressemble à du XML. Il existe des librairies pour lire et traiter le XML. Et en plus les datas ne sont pas triées => Le traitement sera super long (de l'ordre de n2)

    Voici l'algo que j'utiliserais
    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
    position=0
    pour chaque ligne fichier
    faire
         si ligne=<DOC>
         alors
                mémoriser n° doc
                position=1
                initialiser tableau de lignes
                repartir en début de boucle
          fin si
    
          si ligne=</DOC>
          alors
                position=0
                si tableau lignes non vide
                alors
                      filtrage tableau
                      afficher doc
                      afficher tableau filtré
                      afficher /doc
                fin si
                repartir en début de boucle
         si position=1 alors mémoriser ligne courante dans tableau de lignes
    fin faire
    Et l'algo de filtrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour chaque ligne faire
           pour chaque lignebis prise à partir de la suivante
           faire
                 si lignebis=ligne alors effacer lignebis
           fin faire
    fin pour
    Hé oui, comme les lignes ne sont pas triées, n lignes entraineront n * n itérations
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Suppression de doublons et insertion
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/08/2005, 21h57
  2. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  3. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  4. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04
  5. [LG]Suppression de doublons
    Par moustique31 dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2003, 21h03

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