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'une liste de fichiers


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Par défaut tri d'une liste de fichiers
    Bonjour, je voudrais trier dans l'ordre kexicographique les noms de fichiers de chaque répertoire avec la fonction qsort et la fonction strcmp pour comparer les chaînes. Comme je ne connais pas à l'avance la taille du répertoire j'utilise l'algorithme suivant:
    1. Parcourir le répertoire pour compter le nombre de nb;
    2. Allouer dynamiquement une table tE de char* de taille nb;
    3. Reparcourir le répertoire en allouant dynamiquement pour chaque nom une chaîne de caractères dans laquelle le nom est copié et on je veux affecter l'adresse de cette chaînes aux entrées successives de la table tE;
    4. trier la table avec qsort;
    5. afficher la table tE


    Voici mon avancement et j'aimerais que vous m'aidiez à le corriger:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <string.h>
    /* Allocation de size octets, rend l'adrsse du bloc alloué, ou NULL*/
    void* mallloc(size_t size);
    /*Libération d'un bloc*/
    void free (void *ptr);
     
    void tri(char *rep)
    {
    	DIR *monrep;
    	struct dirent *courant;
    	int nb,i;
    	char* tE;
    		monrep = opendir(rep);
    		if (monrep!=NULL) /*le répertoire existe*/
    		{
    			nb=0;
    			courant = readdir(monrep); /*on lit le premier fichier du répertoire*/
     
    			while (courant!=NULL)
    			{
     
    				nb=nb+1; /*On enregistre le nombre de noms*/
    				courant = readdir(monrep);/*on va jusqu'au fichier suivant*/
    			}
     
    			tE=(char*) malloc(nb * sizeof(char)); /*On alloue un tableau de nb lignes
                                                   de taille "char"*/
    			courant = readdir(monrep);
    			while (courant!=NULL)
    			{
                      for (i=0;i < nb;i=i+1)
    				{
    				tE[i]=(*courant).d_name; /*on remplit chaque ligne du table tE du nom du fichier trouvé*/
    				courant = readdir(monrep); /*on avance dans le répertoire jusqu'au fichier suivant*/
    				}				
    				free (tE);/*on libère le bloc pointé par tE*/
    			}
    			/*Phase de tri de tE*/
    			qsort(tE,sizeof(char),nb,strcmp);
    			/*Affichage de la table t*/
    			for(i=0;i<nb;i=i+1)
    				printf("Ligne%d:%s\n",i,tE[i]);
    		}
    		else
    		{
    			printf("erreur d'ouverture du repertoire");
    		}
     
     
    }
    void main(int nbArgs,char *args[])
    {
     		int a;
            tri(args[a]);
     
    }
    Merci par avance de toute aide !!

    $ Kleer $

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kleer Voir le message
    Voici mon avancement et j'aimerais que vous m'aidiez à le corriger:
    Huh !
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `tri':
    main.c:37: warning: assignment makes integer from pointer without a cast
    main.c:43: warning: passing arg 4 of `qsort' from incompatible pointer type
    main.c:46: warning: format argument is not a pointer (arg 3)
    main.c: At top level:
    main.c:56: warning: return type of 'main' is not `int'
    main.c:55: warning: unused parameter 'nbArgs'
    main.c: In function `main':
    main.c:57: warning: 'a' might be used uninitialized in this function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 6 warnings
    Il y a beaucoup d'erreurs, notamment, l'oubli de rewinddir(), un free() à la barbare, le mauvais choix du type du tableau dynamique, la mauvaise gestion des paramètres de la ligne de commande, le choix erroné de la fonction de tri etc.

    Le C, ça ne s'improvise pas... c'est un métier... Ceci fonctionne :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include <dirent.h>
    #include <sys/types.h>
     
    static int cmp (void const *a, void const *b)
    {
       char const *const *pa = a;
       char const *const *pb = b;
     
       return strcmp (*pa, *pb);
    }
     
    void tri (char *rep)
    {
       DIR *monrep = opendir (rep);
       if (monrep != NULL)          /*le répertoire existe */
       {
          struct dirent *courant;
          size_t nb = 0;
     
          /*on lit le premier fichier du répertoire */
          while ((courant = readdir (monrep)) != NULL)
          {
             nb++;                  /*On enregistre le nombre de noms */
          }
          printf ("%d entrees\n", nb);
     
          rewinddir (monrep);
     
          {
             /* On alloue un tableau de nb lignes de taille "char *" */
             char **tE = malloc (nb * sizeof *tE);
             if (tE != NULL)
             {
                size_t i = 0;
                while ((courant = readdir (monrep)) != NULL && i < nb)
                {
                   tE[i] = strdup (courant->d_name); /*on remplit chaque ligne du table tE du nom du fichier trouvé */
                   i++;
                }
     
                /*Phase de tri de tE */
                qsort (tE, nb, sizeof *tE, cmp);
     
                /*Affichage de la table t */
                {
                   size_t i;
                   for (i = 0; i < nb; i = i + 1)
                   {
                      printf ("Ligne%d : '%s'\n", i, tE[i]);
                      free (tE[i]), tE[i] = NULL;
                   }
                   free (tE), tE = NULL;
                }
             }
          }
       }
       else
       {
          printf ("erreur d'ouverture du repertoire\n");
       }
    }
     
    int main (int argc, char *args[])
    {
       if (argc > 1)
       {
          tri (args[1]);
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.

Discussions similaires

  1. Tri d'une liste de fichiers selon un ordre
    Par Geoffrey49000 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/09/2011, 00h03
  2. Réponses: 2
    Dernier message: 03/07/2006, 20h14
  3. Réponses: 10
    Dernier message: 30/01/2005, 20h53
  4. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 14h55
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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