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

POSIX C Discussion :

Lister contenu d'un répertoire


Sujet :

POSIX C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut Lister contenu d'un répertoire
    bonjour a tous
    voila, j'essaie d'ecrire un programme pour recuperer la racine de cetains fichiers de mon repertoire dans une tableau dynamique en C,

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Trois fonctions à utiliser : opendir, readdir et closedir.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    Mon premier poste a ete tronque

    Bonjour a tous

    Voila, j'essaie d'ecrire un programme pour recuperer la racine de cetains fichier de mon repertoire dans une tableau dynamiaque en C, mais je n'y pas trop
    Ca me dit tjrs segmentation fault

    voila le code que j'ai écrit, e espérant qu'il y ait quelqu'un qui puisse m'aider la dessus, c'est tres urgent

    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
    int main(int argc, char *argv[] )
    {
    char **liste_files;
    int Nb_files;
    int i,status;
     
    int ld, lw, L;
    char *racine, *ext;
    char *extdata=".ima";
    char *extweight=".weight.ima";
    char *nom;
    statut=0;
     
    struct dirent *lecture;
    DIR *rep;
     
    rep = opendir(argv[1]);
     
    Nb_files=0;
    liste_files=NULL;
    while ((lecture = readdir(rep)))
    {
    L=strlen(lecture->d_name);
    if(L>lw)//peut etre un fichier weight
    {
    ext=str_sub(nom, L-lw,L-1);
    if(strcmp (extweight, ext)==0)//fichier weight
    {
    printf("fichier weight: extension %s, racine: %s\n",ext, str_sub(lecture->d_name, 0,L-lw-1));
     
    }
    else
    {
    ext=str_sub(nom, L-ld, L-1);
    if(strcmp (extdata, ext)==0)//fichier data
    {
    Nb_files++;
    liste_files = (char**)realloc(liste_files,Nb_files*sizeof(char*));
    strcpy(liste_files[Nb_files-1],str_sub(lecture->d_name, 0,L-ld-1));
    }
     
    }
     
    }
    else
    {if(L>ld)
    {
    ext=str_sub(nom, L-ld, L-1);
    if(strcmp (extdata, ext)==0)//fichier data
    {
    Nb_files++;
    liste_files = (char**)realloc(liste_files,Nb_files*sizeof(char*));
     
    liste_files[Nb_files-1]=str_sub(nom, 0,L-ld-1);
    }
    }
    }
    }
    closedir(rep);
     
    printf("nombre de fichier data, d%n", Nb_files);
     
    for (ld=0;ld<Nb_files;ld++)
    printf("nom fichier : %s\n",liste_files[ld]);
    return status;
    }
    SVP,quelqu'un pourrait-il m'aider a trouver la solution!!

  4. #4
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    je regarde pas tant que y a pas la balise code autour
    "vaste programme"

  5. #5
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    Salut,
    man scandir
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    j'ai verifie mon code sans les troncatures que je deverais faire, et ca marche, le probleme je pense me vient de cette fonction
    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
    char *str_sub (const char *s, unsigned int start, unsigned int end)
    {
      char *new_s = NULL;
     
      if (s != NULL && start < end)
      {
        new_s = malloc (sizeof (*new_s) * (end - start + 2));
        if (new_s != NULL)
        {
          int i;
     
          for (i = start; i <= end; i++)
          {
            new_s[i-start] = s[i];
          }
          new_s[i-start] = '\0';
        }
        else
        {
          fprintf (stderr, "Memoire insuffisante\n");
          return NULL;
        }
      }
      return new_s;
    }
    je n'arrive pas a voir le probleme pour le monmnet sachant que ca marchait bien avant

    si vous pouvez le regarder , peut etre que vous verrez la fautes plutot que moi!!

    merci d'avance

  7. #7
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    if (new_s != NULL)
    n'est jamais vérifiée puisque tu l'initialise à NULL.
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  8. #8
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    Non, ce n'est pas ça j'ai pas fais attention au malloc au dessus
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *str_sub (const char *s, unsigned int start, unsigned int end)
    {
     char *new_s = NULL;
     ...
      if (s != NULL && start < end)
      {
        new_s = malloc (sizeof (*new_s) * (end - start + 2));
        if (new_s != NULL)
        {
        .....
    new_s est comparee a NULL apres allocation de la memooire, ca reste a null dans le cas ou il n'y a pas assez de memoire
    sinon ca passe a l'etape de l'extraction

    je pense que le probleme n'est pas dans ce bout de code,

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par yakamoneye Voir le message
    Non, ce n'est pas ça j'ai pas fais attention au malloc au dessus
    effectivement j'ai repondu un peu en retard

  11. #11
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    Chez moi ta fonction "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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
     
    char *str_sub (const char *s, unsigned int start, unsigned int end)
    {
      char *new_s = NULL;
     
      if (s != NULL && start < end)
      {
        new_s = malloc (sizeof (*new_s) * (end - start + 2));
        if (new_s != NULL)
        {
          int i;
     
          for (i = start; i <= end; i++)
          {
            new_s[i-start] = s[i];
          }
          new_s[i-start] = '\0';
        }
        else
        {
          printf ("Memoire insuffisante\n");
          return NULL;
        }
      }
      return new_s;
    }
     
     
     
    int main(void)
    {
      char buf[256];
      char* buf2;
      strcpy(buf, "azertyuiop");
      printf("%s\n",buf);
      buf2=str_sub(buf, 2, 5);
      printf("%s\n",buf2);
     
    return 0;
    }
    voila le résultat:
    [yakamoneye@localhost ~]$ gcc toto.c -o toto
    [yakamoneye@localhost ~]$ ./toto
    azertyuiop
    erty
    [yakamoneye@localhost ~]$
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    oui c vrai
    je ne vois pas ou est le problème
    voila, je veux écrire une fonction qui me renvoie tableau des noms racines des fichiers de mon répertoire ayant que l'extension .ima et non .weight.ima et la, je bidouille la fonction depuis bien longtemps et je n'arrive tjrs pas a trouver la faille,
    tt ca juste pour recuperer les noms des images qui m'interessent et non pas le reste
    pour pouvoir ecrire reellement ce qui m'est demande a faire!!
    alors svp, si vous avez de suggestions, je suis prenante

  13. #13
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    utilise scandir

    extrait du man:
    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
     
     #define _SVID_SOURCE
           /* Afficher le contenu du répertoire en ordre inverse */
           #include <dirent.h>
           int
           main(void)
           {
               struct dirent **namelist;
               int n;
     
               n = scandir(".", &namelist, 0, alphasort);
               if (n < 0)
                   perror("scandir");
               else {
                   while (n--) {
                       printf("%s\n", namelist[n]->d_name);
                       free (namelist [n]);
                   }
                   free (namelist);
               }
           }
    effectue un test
    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
     
    int size;
    while(n--)
    {
     
      size=strlen(namelist[n]->d_name);
      if ( (namelist[n]->d_name)[size] == 'a' && (namelist[n]->d_name)[size-1] == 'm'    && (namelist[n]->d_name)[size-2] == 'i' )
      {
      /* le fichier porte l'extension ima */
        if (  strstr( namelist[n]->d_name, ".weight.ima" )
        {
          /* alors ce champ ne nous interresse pas */
        }
        else
        {
        /* tu le stockes */
        }
      }
    }
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    Ok

    Merci pour le tuyau, j'essaie ca et je te donnerai de mes nouvelles,

    Merci :-)

  15. #15
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    c est pas POSIX scandir par contre
    "vaste programme"

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    vous pourrez me donner son équivalent posix svp?/

  17. #17
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    ben cest ca
    "vaste programme"

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par BainE Voir le message
    ben cest ca
    non, je ne crois pas que c'est que je cherche
    merci quand meme

    pour scandir, il me reste tourjs un probleme a la fin
    j'ai toujours un segmentation fault

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 78
    Points
    78
    Par défaut
    voila, j'ai reussi a regler le probleme, merci beaucoup pour ceux qui m'ont aide
    ci-joint le code au cas ou ca pourrait servir un jour
    je chercherais apres pour la norme posix,
    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
    int main(int argc, char *argv[] )
    {
      struct dirent **namelist;
      char **list_files;
      char *name;
      int n,i;
     
      int ld, lw, L, Nb_files;
      char *racine, *ext;
      char *extdata=".ima";
      char *extweight=".weight.ima";
     
      n = scandir(argv[1], &namelist, 0, alphasort);
      printf("nombre de fichiers %d", n);
      if (n < 0)
         perror("scandir");
     
       else 
        {
          Nb_files=(int)(n/2-1);
          ld=strlen(extdata);
          lw=strlen(extweight);
     
          list_files=(char**)malloc(Nb_files*sizeof(char*));
          i=0;
          while (n-- && i<Nb_files)
              {
    	    name= namelist [n]->d_name;
    	    free( namelist [n] );  
     
    	    L=strlen(name);
    	      if(L>lw)//peut etre un fichier weight
    		{
    		  ext=str_sub(name, L-lw,L-1);
    		  if(strcmp (extweight, ext))//fichier weight
    		     {
    		      ext=str_sub(name, L-ld, L-1);
    		      if(strcmp (extdata, ext)==0)//fichier weight
    			{
    			  list_files[i]=str_sub(name, 0,L-ld-1);
    			  printf("fichier : %s\n",list_files[i]);
    			  i++;
     			} 
     
    		    }
     
    		}
    	      else
    		{
    		  ext=str_sub(name, L-ld, L-1);
    		  if(strcmp (extdata, ext)==0)//fichier weight
    		    {
    		      list_files[i]=str_sub(name, 0,L-ld-1);
    		      i++;   	      
     
    		    } 
    		}
     
    	   }
          // free (namelist);
             }
     return 0;
    }
    si vous trouvez avons moi n'hesitez pas a me recontacter svp
    Merci

  20. #20
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    BainE a raison scandir n'est pas POSIX, mais elle pourrait le devenir... (affaire à suivre )
    en attendant, il faut faire une "fonction à la main" en utilisant opendir et readdir qui le sont.
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

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

Discussions similaires

  1. Lister contenu d'un répertoire (très simple)
    Par storm85 dans le forum Général Python
    Réponses: 1
    Dernier message: 15/12/2010, 17h10
  2. Lister le contenu d'un répertoire présent dans le classpath
    Par kaptainflam dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/08/2007, 16h08
  3. Réponses: 5
    Dernier message: 30/08/2006, 18h23
  4. Lister le contenu d'un répertoire
    Par rob_57 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/10/2005, 19h16
  5. Lister le contenu d'un répertoire distant
    Par dody dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 17h23

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