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 :

Parcours de fichier, structure et liste chaînée


Sujet :

C

  1. #1
    Membre expérimenté Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Par défaut Parcours de fichier, structure et liste chaînée
    Bonsoir,

    Je suis entrain de faire un petit programme C qui permet de liste le contenu d'un répertoire.

    Je souhaite parcourir le-dit répertoire, et stocker les informations dans une structure qui va bien, puis parcourir cette structure pour afficher les informations.

    J'ai donc une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct liste_fichier
    {
       struct dirent* fichier;
       struct liste_fichier* suivant;
     
    }sFichier;

    La fonction qui remplis ma structure avec les informations est la suivante :

    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
    sFichier* parcourir(char* repertoire)
    {
       DIR *rep;
       if((rep = opendir(repertoire))==NULL)
       {
          fprintf(stderr,"Impossible d'ouvrir le dossier %s\n",repertoire);
          exit(2);        
       }
     
       sFichier* listeFichier = NULL;
       sFichier* nouveau, *courant;
       struct dirent *lecture;
     
    struct stat st; 
    
       while ((lecture = readdir (rep)))
       {
          stat (lecture->d_name, &st);
          time_t t = st.st_mtime;
          struct tm tm = *localtime (&t);
          char s[32];
          strftime (s, sizeof s, "%d/%m/%Y %H:%M:%S", &tm);
          fprintf(stdout,"%-14s %s\n", lecture->d_name, s);  
          if(listeFichier==NULL)
          {
             nouveau=(sFichier*) malloc (sizeof(sFichier));
             nouveau->fichier = lecture;
             listeFichier=nouveau;
             courant=listeFichier;
          } 
          else
          {
             nouveau=(sFichier*) malloc (sizeof(sFichier));
             nouveau->fichier = lecture;
             courant->suivant=nouveau;
             courant=courant->suivant;
          }
       }
       courant->suivant=NULL;
       closedir(rep);
       rep = NULL;   
       return listeFichier;
    }

    Et enfin, la fonction d'affichage du contenu est la suivante :

    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
    void affichage(sFichier* listeFichier)
    {
       sFichier* courant = listeFichier;
       struct stat st;   
     
       while(courant!=NULL)
       {
          stat (courant->fichier->d_name, &st);
          time_t t = st.st_mtime;
          struct tm tm = *localtime (&t);
          char s[32];
          strftime (s, sizeof s, "%d/%m/%Y %H:%M:%S", &tm);
          fprintf(stdout,"%-14s %s\n", courant->fichier->d_name, s);
          courant=courant->suivant;
       
       }
    }

    Mon problème est le suivant : les deux lignes en rouge n'affichent pas la même chose, et je ne comprend pas pourquoi...
    J'ai loupé quelque chose ? (ou devrais-je dire, qu'ais-je loupé, puisque j'ai assuremment loupé quelque chose...)

    D'avance merci à ceux qui pourront m'aider

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    parcourir stocke l'adresse de la structure dirent dans le champ fichier comme information. Cette même structure dirent sera modifiée par les appels suivants à readdir et sera détruite par le closedir à la fin de la fonction.

    affichage utilise pour toutes les cellules l'adresse de cette structure dirent qui, détruite, ne contient que le fantôme des données du dernier fichier obtenu par readdir.

    Dans parcourir, il faut recopier les données utiles contenues dans dirent dans sFichier au lieu d'utiliser ce pointeur sur dirent

  3. #3
    Membre expérimenté Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Par défaut
    Fichtre, je n'avais pas vu la chose sous cet angle. Je te remercie bien pour cet éclaircissement et m'en vais faire les modifications nécessaires

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Par défaut
    bonjour

    j'ai le meme probleme avec mon programe mais la function readdir ne retiene pas le premiere directory stream apres une deucieme appell il feux utiliser readdir_r pour ça ou tu peux stocker tes donnes dans une structure moi j'ai pensé à une pile et apres tu peu sortir les donnes

    bonne chance

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

Discussions similaires

  1. Structure pour liste chaînée
    Par wallace27 dans le forum C
    Réponses: 3
    Dernier message: 27/02/2015, 15h22
  2. Réponses: 10
    Dernier message: 22/03/2014, 14h28
  3. Problème listes chaînées et fichier texte
    Par khayyam dans le forum Pascal
    Réponses: 2
    Dernier message: 24/01/2007, 20h11
  4. Listes chaînées et fichiers binaires
    Par asgardia dans le forum C
    Réponses: 3
    Dernier message: 26/11/2006, 16h29
  5. listes chaînées/fichiers je bloque
    Par ghislain118 dans le forum C
    Réponses: 14
    Dernier message: 21/12/2005, 08h24

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