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 :

Probleme de readdir


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut Probleme de readdir
    Bonjour, j'ai fais un programme qui me liste tous les fichiers d'un répertoire
    Bien sur, si dans ce répertoire, il y a un autre répertoire, on l'affiche

    Voila un exemple :
    Ouverture repertoire "/cpp"
    fichier1
    fichier2
    [...]
    repertoire : projets_sdz
    //affichage du repretoir projets_sdz
    [...]

    Tout marche sauf que voila mon probleme :

    Je recupere le nom du repertoire dans : lecture->d_name.
    je veux opendir le repertoire lecture->d_name.
    je peux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open=opendir(lecture->dir_name);
    Car il faut un slash avant lecture->d_name !!
    je peux pas faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open=opendir("/"lecture->dir_name);

    Alors comment je fais ?

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Salut et bienvenue sur les forums de Developpez

    Ce que tu cherches à faire c'est concaténer (coller) deux chaines de caractères. Ca se fait avec la fonction strcat().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(char *destination, char *ajout);
    Attention : la chaine destination doit être suffisament grande pour contenir la chaine ajout à la suite.
    Donc ce que tu peux faire c'est créer une chaine ne contenant que le slash au départ mais suffisament grande pour contenir aussi le nom. Puis tu ajoutes ton chemin. Une autre solution serait de passer par une allocation dynamique pour avoir la taille pile mais bon ...

    Nas'

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut
    Oui j'y ai réfléchi mais lecture->d_name n'est pas une string

  4. #4
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Si, lecture->dname est un char* donc une chaine de caractère.
    http://c.developpez.com/faq/c/?page=...dir_list_POSIX

    Nas'

  5. #5
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par lapras123
    Oui j'y ai réfléchi mais lecture->d_name n'est pas une string
    Ah bon ? Etrange....

    Citation Envoyé par man readdir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       struct dirent {
                  ino_t          d_ino;       /* inode number */
                  off_t          d_off;       /* offset to the next dirent */
                  unsigned short d_reclen;    /* length of this record */
                  unsigned char  d_type;      /* type of file */
                  char           d_name[256]; /* filename */
              };
    Apparement c'est bien une chaine. Ou plutot un tableau de char.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut
    Donc je fais :

    strcat(lecture->d_name, "/");

    ?

    Ca marche mais le / est a la fin :s

  7. #7
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par man
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *strcat(char *dest, const char *src);
    strcat porte mal son nom... ca devrait plutot etre strappend().

    En fait elle ajoute la chaine src a la chaine dst.

    Note: La chaine dst doit etre assez grande pour supporter l'ajout.

    Donc il faut que tu alloue une chaine de la taille necessaire, a savoir strlen(lecture->d_name + 2) (=> +1 pour le '/', +1 pour le '\0') que tu mettes le '/' au debut puis que tu appelles strcat pour rajouter lecture->d_name a la fin.

    Bonne chance.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut
    char *chaine=NULL;
    chaine=malloc(strlen(lecture->d_name + 2));
    chaine[0]="/";
    strcat(chaine, lecture->d_name);

    heu ca marche pas

  9. #9
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    Citation Envoyé par lapras123
    char *chaine=NULL;
    chaine=malloc(strlen(lecture->d_name + 2));
    chaine[0]="/";
    strcat(chaine, lecture->d_name);

    heu ca marche pas
    hmm normal, déjà tu met un "/" dans chaine[0], pourquoi?
    tu voulais mettre un "\0"?

    essaye aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine=malloc(strlen(lecture->d_name)*sizeof(char)+1);
    Après cela,ça doit marcher...normalement

  10. #10
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Non, il voulait bien mettre un slash (cf son premier post ).

    heu ca marche pas
    C'est-à-dire? Une erreur à la compilation? Une erreur à l'exécution?

    char *chaine=NULL;
    char *test = "C:/Documents" ;
    chaine=malloc(strlen(test) + 2);
    chaine[0]="/";
    strcat(chaine, test);
    m'affiche bien la chaine /C:/Documents.

    Nas'

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Nasky
    m'affiche bien la chaine /C:/Documents.
    Comportement indéfini :

    what.c:10: warning: assignment makes integer from pointer without a cast
    Il faudrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(chaine,"/");
    et non
    Jc

  12. #12
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par fearyourself
    Le probleme est beaucoup plus simple:

    Au lieu de
    Le warning venait de la...

  13. #13
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Oui j'avais bien remplacé les guillemets par des quote. Désolé, problème de copier/coller du code d'origine.

    Nas'

  14. #14
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par Nasky
    Oui j'avais bien remplacé les guillemets par des quote. Désolé, problème de copier/coller du code d'origine.

    Nas'
    Rhooo la vilaine excuse

  15. #15
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Citation Envoyé par Jack_serious
    Rhooo la vilaine excuse
    Mais euh !!

    Nas'

  16. #16
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Jack_serious
    Le probleme est beaucoup plus simple:

    Au lieu de
    Le warning venait de la...
    Non, parce qu'il faut mettre un '\0' aussi. Donc tu pourrais le faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chaine[0] = '/';
    chaine[1] = '\0';
    ou plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(chaine,"/");
    Jc

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut
    merci ca marche pour le '/' devant
    Maintenant c'est pas tout, chaine="/repertoire1";
    ma lecture du repertoire chaine marche pas

    Bon voici le code entier de la lecture dun repertoire courant auinsi que tous ses répertoires et fichiers :

    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
     
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    void affiche_repertoire(char repertoire[]);
    int main(void)
    {
      char repertoire[]=".";
      affiche_repertoire(repertoire);
       system("PAUSE");
       return 0;
    }
     
    void affiche_repertoire(char repertoire[]) {
    struct dirent *lecture;
       DIR *rep;
       rep = opendir(repertoire);
       printf("___________________________\n");
       while (lecture = readdir(rep))
       {  
     
             if(strchr(lecture->d_name, '.')==NULL) {
             char *chaine=NULL;
             chaine=malloc(strlen(lecture->d_name + 2));
             chaine[0]='/';
             strcat(chaine, lecture->d_name);
             printf("    Repertoire %s : \n", chaine);
             affiche_repertoire(chaine);
             free(chaine);
             }
             else {
             printf("FICHIER: %s\n", lecture->d_name);
             }
     
       }
       printf("___________________________\n");
       closedir(rep);
    }

    j'utilise la récursivité ^^
    Fichiers attachés Fichiers attachés

  18. #18
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Faudrait corriger ces warnings...

    recu.c: In function 'main':
    recu.c:9: warning: implicit declaration of function 'system'
    recu.c: In function 'affiche_repertoire':
    recu.c:18: warning: suggest parentheses around assignment used as truth value
    recu.c:21: warning: implicit declaration of function 'strchr'
    recu.c:21: warning: incompatible implicit declaration of built-in function 'strchr'
    recu.c:23: warning: implicit declaration of function 'malloc'
    recu.c:23: warning: incompatible implicit declaration of built-in function 'malloc'
    recu.c:23: warning: implicit declaration of function 'strlen'
    recu.c:23: warning: incompatible implicit declaration of built-in function 'strlen'
    recu.c:25: warning: implicit declaration of function 'strcat'
    recu.c:25: warning: incompatible implicit declaration of built-in function 'strcat'
    recu.c:28: warning: implicit declaration of function 'free'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chaine[0]='/';
    strcat(chaine, lecture->d_name);
    NON!
    Voir http://www.developpez.net/forums/sho...8&postcount=16

    Jc

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Par défaut
    Bon voila c'est corrigé mmais le résultat est le meme : le repertoire "." est bien listé, mais le repertoire "/essai" qui est dans mon repertoire courant n'est pas listé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine=malloc(strlen(lecture->d_name + 2));
             strcpy(chaine,"/");
             strcat(chaine, lecture->d_name);

  20. #20
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Code commenté...

    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
    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
     
    /* Il manque ceci : */
    #include <stdlib.h>
    #include <string.h>
     
     
    void affiche_repertoire(char repertoire[]);
     
    int main(void)
    {
      char repertoire[]=".";
      affiche_repertoire(repertoire);
      system("PAUSE");
      return 0;
    }
     
    void affiche_repertoire(char repertoire[]) {
       struct dirent *lecture;
       DIR *rep;
       rep = opendir(repertoire);
     
       /* Il faut tester rep */
       if(rep != NULL)
        {
        printf("___________________________\n");
     
        /* Correct mais dangereux, préféré :
        while (lecture = readdir(rep))
        */
        while ( (lecture = readdir(rep)) != NULL)
        {  
     
    	 /* Pas portable, sous linux les fichiers non pas forcément de . et 
    	    les répertoires peuvent en avoir
     
    	    Sous windows aussi, moins courant mais possible (pour les répertoires, je n'ai pas testé)
    	 */
     
             if(strchr(lecture->d_name, '.')==NULL) {
             char *chaine=NULL;
     
    	 /* Faux, à mon avis tu voulais : 
             chaine=malloc(strlen(lecture->d_name + 2));
    	 */
    	 chaine=malloc(strlen(lecture->d_name) + 2);
     
    	 /* Faudrait ajouter la chaine repertoire, non? et pour cela il faut changer le malloc ...*/
     
             strcpy(chaine,"/");
             strcat(chaine, lecture->d_name);
             printf("    Repertoire %s : \n", chaine);
             affiche_repertoire(chaine);
             free(chaine);
             }
             else {
             printf("FICHIER: %s\n", lecture->d_name);
             }
        }
        printf("___________________________\n");
        closedir(rep);
        }
    }
    Jc

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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