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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    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 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    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).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 792
    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 chevronné
    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
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    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 émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Tu ne compilerais pas en C++ par hasard ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

+ 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: 7
    Dernier message: 15/02/2025, 17h06
  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