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 :

Tri d'un fichier


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Tri d'un fichier
    Bonjour,
    je dois lire un fichier le trier et mettre le resultat dans flotEcriture.
    Mon fichier contient un mot par ligne.
    Par exemple:
    le
    la
    les
    un
    une
    des
    Mon problème est que je ne sais pas comment faire pour recuperer les lignes pour appeler la fonction de comparaison.
    Dans la iteration de la boucle while ,j'ai le mais ensuite ?
    Est ce qu'il faut que je fasse :
    int (*)(ligne ,ligne +1)strcmp pour faire le trie suivant la fonction strcmp

    Merci



    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
    int triFlots(FILE *flotLecture, FILE *flotEcriture, 
    	     int (*cmp)(const char *s1, const char *s2))
    {
       char ligne[256];
     
       if(flotLecture != NULL)
       {
          while(fgets(ligne, sizeof ligne, flotLecture) != NULL)
          {
             fprintf(flotEcriture,"%s",ligne);
          }
       }
       fclose(flotEcriture);
       fclose(flotLecture)
       return 0;
    }
    Titre modifié par Anomaly : Merci de mettre des titres clairs afin que les membres aient envie de lire ton message

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Tout d'abord, as-tu trouvé un algo pour trier ?

    Ensuite, je ne comprend pas ta ligne :

    int (*)(ligne ,ligne +1)strcmp
    C'est quoi ça ?

    strcmp a la signature suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int strcmp(const char *s1, const char *s2);
    Le retour de la fonction est le suivant :

    The strcmp() and strncmp() return an integer greater than, equal to, or
    less than 0, according as the string s1 is greater than, equal to, or
    less than the string s2. The comparison is done using unsigned characters, so that `\200' is greater than `\0'.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Faut aussi faire attention à la fin de la chaîne retournée pas fgets, si la fonction trouve un saut de ligne \n, celui-ci est également inséré dans la chaîne retournée par fgets.

    Ceci est important à savoir car si tu compares une chaine ayant un \n et l'autre n'en possédant pas tu l'as dans l'os
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Pour faire plus simple,je voudrais savoir comment faire pour recuperer la ligne suivante de fgets pour faire le tri.
    le
    la
    les
    un
    une
    des

    La fonction de comparaison est faite

    Ps:si je definis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int(*cmp)(const char *s1, const char *s2)
    Comment est ce que j'utilise ce pointeur pour appeler avec strcmp?

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il faudrait en fait que tu mettes dans un tableau toutes tes chaines et ensuite tu trie le tableau. Parce que la lecture et écriture dans ton fichier directement risque d'être très lent.

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par PRomu@ld
    Il faudrait en fait que tu mettes dans un tableau toutes tes chaines et ensuite tu trie le tableau. Parce que la lecture et écriture dans ton fichier directement risque d'être très lent.
    Par exemple ,si je fais pour recuperer,c'est corecte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char **tab;
    int i = 0;
    char ligne[256];
    while(fgets(ligne,sizeof ligne,flot) !=NULL)
     {
         tab[i] = malloc(strlen(ligne)+1);
          if(mot == NULL)
            return 1;
        strcpy(tab[i],ligne);
        i++;
    }

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pour allouer un tableau à 2 dimenssions: http://c.developpez.com/faq/c/?page=...bleau_2D_alloc
    et si tu ne connais pas la taille de ton tableau par avance, il faut aussi jouer avec realloc de préférence sinon tu perds tout au prochain malloc !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char **tab;
    int i = 0;
    char ligne[256];
    while(fgets(ligne,sizeof ligne,flot) !=NULL)
     {
         tab[i] = malloc(strlen(ligne)+1);
          if(mot == NULL)
            return 1;
        strcpy(tab[i],ligne);
        i++;
    }
    Tu n'alloue pas d'abord tab, d'ailleurs quelle taille lui donner ?
    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
    char **tab;
    int i = 0;
    char ligne[256];
    int taille = 10;
    if ((tab = malloc(taille * sizeof(*tab))) == NULL)
      return 1;
    while(fgets(ligne,sizeof ligne,flot) !=NULL)
     {
        // on elimine le '\n';
        char *p = strchr(ligne, '\n');
        if (p == NULL)
        {
           // problème ton buffer de lecture est trop petit
        }
        else
          *p = 0;
     
        tab[i] = malloc(strlen(ligne)+1);
          if(tab[i] == NULL)
            return 2;
        strcpy(tab[i],ligne);
        i++;
       if( i == taille)
       {
           char **tmp;
          // on double la taille du tableau
          taille *= 2; 
          tmp = realloc(tab, taille * sizeof(*tab));
          if (tmp == NULL)
          {
             // tu l'as dans l'os mais tu conserves quand même 
             // l'ancienne valeur du tableau
             // a toi de voir ce que tu veux faire 
          }
          else
              tab = tmp;
       } 
     
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par PRomu@ld
    Il faudrait en fait que tu mettes dans un tableau toutes tes chaines et ensuite tu trie le tableau. Parce que la lecture et écriture dans ton fichier directement risque d'être très lent.

    Bonjour,

    Merci pour vos réponses et remarque.

    Et comment faut-il faire (c'était ma question intiale) sans passer par le tableau pour faire le tri d'un fichier?

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu peux mémoriser tes lignes dans un tableau puis utiliser le qsort du C avec la fonction adéquate de comparaison. Ce qui serait lent c'est d'insérer la ligne dans le tableau trié, quoique si le fichier n'est pas gros ...
    D'un point de vue technique, l'insertion dans un tableau trié est un algo à connaître.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Si ton fichier n'est pas trops gros, tu peux trier ton tableau sur place, avec un algo du type tris par insertion. Parce que le quickSort n'est pas évident et en plus du fait des entrées-sorties répétées ça risque de ne pas être beaucoup plus rapide qu'un tri ordinaire...

    De toute façon, si tu n'as pas beaucoup de ligne à trier, mieux vaut utiliser un algo que tu puisses implémenter simplement.

    Sinon, tu as toujours la possibilité de faire un appel à des commandes de ton système. Sous linux, tu as la commade sort, avec des redirections ou des pipes, ça peut aussi le faire. Cependant tu va perdre la portabilité.

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    PRomu@ld >> Le qsort ne sera fait qu'une fois toutes les lignes lues bien évidemment.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Oui j'avais compris celà mais apparement la question est celle ci :

    Et comment faut-il faire (c'était ma question intiale) sans passer par le tableau pour faire le tri d'un fichier?
    Je vois donc mal comment un qsort pourrait être possible simplement.

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ça m'apprendra à lire de travers
    Et comment faut-il faire (c'était ma question intiale) sans passer par le tableau pour faire le tri d'un fichier?
    Tu as une possibilité en utilisant deux fichiers intermédiaires : le principe est simple:
    tu lis une ligne du fichier, si elle est plus grande par ordre alphabétique que la précédente, tu l'écris dans le même fichier, sinon tu l'écris dans l'autre, etc.
    Quand c'est fini, tu réouvres le deux fichiers en lecture et tu recommences de la même manière. Au bout d'un certain nombre de tours tu obtiendras un fichier trié.
    Exemple avec la liste
    le
    la
    les
    une
    un
    des

    Premier tour
    fichier 01 : le, un,
    fichier 02 : la, les, une, des

    Deuxième tour
    fichier 11 : la, le, les, un, une,
    fichier 12 : des

    Troisième tour :
    fichier 21 : des, la, le, les, un, une
    fichier 22 :

    Terminé.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Au bout d'un certain nombre de tours tu obtiendras un fichier trié.
    Oui tu t'arrête quand le deuxième fichier est vide ...

    Le soucis comme toujours avec les fichiers c'est que ce genre d'algo est assez long (beaucoup de lecture écriture).

    Si tu peux te contenter de ce genre d'algo, ne te complique pas la vie. Sinon, il faut que tu utilise un algo qui minimise le nombre de lecture écriture.

Discussions similaires

  1. Tri d'un fichier tres volumineux
    Par TonyJ dans le forum Général Java
    Réponses: 6
    Dernier message: 09/02/2007, 14h50
  2. Optimiser le tri d'un fichier
    Par mejri dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/11/2006, 09h56
  3. [VBA Excel Débutant] Tri d'un fichier Excel depuis Access
    Par elgringo2007 dans le forum Access
    Réponses: 3
    Dernier message: 07/08/2006, 16h21
  4. tri d'un fichier texte
    Par ben127 dans le forum C
    Réponses: 7
    Dernier message: 23/12/2005, 20h03

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