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 :

Lister les fichiers d'un répertoire dans un tableau de char


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut Lister les fichiers d'un répertoire dans un tableau de char
    Bonjour.

    Je souhaite lister les fichiers d'un répertoire dans un tableau pour ensuite leur appliquer 1 à 1 un traitement particulier.

    Mon idée d'organisation est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // je liste les noms des fichiers à traiter dans un tableau 
    char *tab_list_files[256];
     
    //je fais une boucle qui va traiter tous les fichiers
    While(tab_list_files[i]!=NULL)
    {
        current_file = tab_list_files[i];
        traitement();
        i++
    }
    1 - Est ce que c'est une bonne organisation?


    2 - J'ai un problème technique dans mon code à l'étape qui consiste à lister les fichiers à traiter et les stocker dans un tableau de char:

    - je liste les fichiers d'un répertoire
    - si le nom de fichier commence par "debut", je l'affiche et je le stock dans mon tableau
    -> OK
    - mais une fois le listing terminé, quand je veux réutiliser les noms de mes fichiers séléctionnés, ils ont tous pris le nom du dernier fichier lu dans le répertoire...

    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
     
    char *tab_list_files[256];
    int i;
     
    int main()
    {
     
        struct dirent *lecture;
        DIR *rep;
        rep = opendir("." );
     
        i=0;
     
        while ((lecture = readdir(rep))) {                  // on lit tous les fichiers du répertoire local
     
            if(!strncmp(lecture->d_name,"debut",5))       // si les 5 premières lettres du nom de fichier = "début"
            {
                tab_list_files[i] = lecture->d_name;        // alors on enregistre ce nom de fichier dans le tableau tab_list_files
                printf("%s\n", tab_list_files[i]);          // T1 au passage on l'affiche
                i++;                                        
            }
     
        }
        closedir(rep);
     
        i=0;
        while(tab_list_files[i]!=NULL)                      // on va afficher toutes les noms de fichiers stoquées qui ne sont pas vides
        {
            printf("\n+1 %s\n",tab_list_files[i]);           // T2 on réaffiche les noms des fichiers commençant par "début" -> cela ne marche pas
            i++;
        }
     
     
        getch();
        return 1;
    }
    Ce code ne fonctionne pas car tab_list_files[i] = lecture->d_name; ne copie pas la valeur de lecture->d_name dans tab_list_files[i], il ne fait que pointer, du coup les tab_list_files[i] affichent tous la dernière valeur prise par lecture->d_name : le nom du dernier fichier du répertoire lu.

    Donc j'ai pensé à utiliser strcpy(tab_list_files[i],lecture->d_name);

    Compilation ok mais crash du programme à l’exécution.

    Comment que je dois faire pour arranger ça?

    Merci.


    PS : pour la lecture des fichiers du répertoire j'ai utilisé un code que j'ai trouvé tout fait sur le net... si vous avez une toute autre prosposition, tant que c'est du C, je prends

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 037
    Points
    33 037
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    pour utiliser strcpy la chaîne de destination doit être assez grande pour contenir la chaîne source.
    Dans ton cas la chaîne destination est... complètement indéfini puisque non allouée.

    char* tab[254] défini un tableau de 254 char* il me semble, et non un pointeur sur des char[254]

    Peut-être qu'une struct intermédiaire assurerait de créer un pointeur sur des char[254]
    struct myDirName { char str[254]; };en créant un struct myDirName* myTabOfNames; pour avoir un tableau, toujours à initialiser.

    Dans tous les cas, container non initialisé ou contenu non initialisé, ça manque d'initialisation.

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    1 - ok, le tableau alloué statiquement n'est pas très esthétique, mai si tu essuie que tu n'as pas plus de 256 fichiers. :p

    2 - En fait char*[256] declare 256 pointeurs sur char sur des chaînes statiques. Quand tu essayes de copier le nom de ton fichier dans une case du tableau, mais tu accèdes à un emplacement à lecture seule. D'où une erreur de segmentation.
    Pour remédier à cela tu peux utiliser un tableau à deux dimensions char tab[256][MAXLEN] où MAXLEN est une taille représentative de la taille maximale d'un nom de fichier. (il me semble qu'il y a une variable posix qu'il l'indique, à voir).

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 650
    Points : 1 664
    Points
    1 664
    Par défaut
    Hello,

    Ce que je ferais das ton cas, c'est conserver le tout tel quel, et pour mémoriser le nom du ficher il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab_list_files[i]=malloc(strlen(lecture->d_name)+1);
    strcpy(tab_list_file[i],lecture->d_name);
    et le tour est joué.

    Deux choses encore à faire: vérifier que malloc() ne renvoie pas NULL, et ne pas oublier de faire une boucle i* pour libérer tab_list_file[i] quand tu n'en as plus besoin...

    Cordialement,

    Edgar.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut malloc & Co
    salut !
    avec la taille du cache des disques durs actuels, il me faut surtout pas hésiter à accéder plusieurs fois à des données dont on est certain de la présence dans ce cache...
    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
    #include <stdio.h>
    #include "dirent.h"
     
    char ** dirtab(const char * s){
    		int i, j;
    		DIR * dir;
    		struct dirent * e;
    		i = 0;//compte les noms
    		j = 0;//compte la somme des tailles des moms
    		dir = opendir(s);
    		while ((e = readdir(dir))){
    			if ((strcmp(e -> d_name, ".") && strcmp(e -> d_name, ".."))){//on n'a pas besoin de . et .. 
    				j += strlen(e -> d_name) + 1;// + 1 pour le 0 terminal
    				i++;
    			}
    		}
     
    		char ** p = (char **) malloc((i + 1) * sizeof(char *));//on alloue la place pour le tableau + 1 pour NULL
    		char * r = (char *) malloc(j);//on alloue la place pour toutes les chaînes en tas
     
    		rewinddir(dir);//on recommence la lecture
    		i = 0;
    		while ((e = readdir(dir))){
    			if (strcmp(e -> d_name, ".") && strcmp(e -> d_name, "..")){
    				p[i++] = strcpy(r, e -> d_name);//on copie les caractères du nom dans le tas, et son pointeur dans le tableau
    				r += strlen(r) + 1;//mise à jour du pointeur de caractères du tas
    			}
    		}
    		p[i] = NULL;
    		closedir(dir);	
    		return p;
    }
     
    void main (void)
    { 
    		int i;
    		char ** t = dirtab(".");
    		for (i = 0 ; t[i] != NULL; i++)
    			printf("%s\n", t[i]);
    		free(*t[0]);//libère le tas de caractères
    		free(t);//libère le tableau
    }
    A+

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Ce que je ferais das ton cas, c'est conserver le tout tel quel, et pour mémoriser le nom du ficher il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab_list_files[i]=malloc(strlen(lecture->d_name)+1);
    strcpy(tab_list_file[i],lecture->d_name);
    et le tour est joué.

    Deux choses encore à faire: vérifier que malloc() ne renvoie pas NULL, et ne pas oublier de faire une boucle i* pour libérer tab_list_file[i] quand tu n'en as plus besoin...

    Cordialement,

    Edgar.
    Bonjour.
    C'est la solution la plus simple, donc la première que j'ai essayé.
    Mais j'ai une erreur à la compilation :
    53 invalid conversion from `void*' to `char'
    J'ai toujours du mal à comprendre!

  7. #7
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Tu ne compilerais pas en C++ par hasard ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    Tu ne compilerais pas en C++ par hasard ?
    Bingo!!!

    Je savais pas qu'il y avait une différence sur la compilation!
    Que C ne compile pas C++ ok, mais que C++ ne compile pas C

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ickis69 Voir le message
    Bingo!!!

    Je savais pas qu'il y avait une différence sur la compilation!
    Que C ne compile pas C++ ok, mais que C++ ne compile pas C
    Hé non, C et C++ sont deux langages cousins mais différents. Tu peux écrire du C++ en n'y mettant que des instructions C et dans ce cas un compilateur C fonctionnera... mais C++ ne compile pas du C standard.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Bon en tout cas merci beaucoup aux participants pour leur efficacité!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les fichiers d'un répertoire dans une feuille Excel
    Par AlainTech dans le forum Contribuez
    Réponses: 3
    Dernier message: 10/03/2016, 14h14
  2. Réponses: 5
    Dernier message: 30/08/2013, 09h06
  3. Lister les fichiers d'un répertoire dans une listebox
    Par soshelpvb dans le forum VB.NET
    Réponses: 8
    Dernier message: 05/11/2012, 11h57
  4. Lister les fichiers d'un répertoire dans une feuille Excel
    Par Kriss63 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/04/2011, 14h54
  5. lister les fichiers d'un répertoire dans un .BAT
    Par isn44 dans le forum Windows
    Réponses: 7
    Dernier message: 10/10/2007, 10h44

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