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

Linux Discussion :

structure dirent, fonction scandir


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut structure dirent, fonction scandir
    Bonjour à tous,

    Voici mon souci, je recupere dans un tableau les noms de fichier d'un dossier grace a la structure dirent et à la fonction scandir

    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
     
    struct dirent **namelist;
    char** dossier;  /* pour stocker les noms de fichiers*/
    char directory[256]; /*contient le chemin du repertoire*/
    int n,m,size;
     
    // recuperation du nom de fichiers .com
     
      n = scandir(directory, &namelist, 0, alphasort);
       if (n < 0)
       {
         perror("scandir failed");
         exit(EXIT_FAILURE);
       }
     
      dossier=(char**)malloc((n-2)*sizeof(char*));  
    /* les fichiers . et .. ne m'interressent pas*/
      m=0;
     
       for(int i=0; i<n; i++) 
       {
         size=strlen(namelist[i]->d_name);
    /*je ne veux recuperer que les noms de fichiers portant l'extension .com les fichiers . et .. ne m'interrressent pas non plus*/
         if( (namelist[i]->d_name)[0] != '.' && (namelist[i]->d_name)[size-1]=='m' && (namelist[i]->d_name)[size-2]=='o' && (namelist[i]->d_name)[size-3]=='c')
         {
           dossier[m]=(char*)malloc(size*sizeof(char));
           dossier[m]=namelist[i]->d_name;
           free (namelist [i]);
           m++; /* au final m traduira le nombre de fichiers
         }
       }
     
      free (namelist);
     
    // affichage pour verification
     
      for (int i=0; i<m; i++)
      {
       printf("\t%s\n",dossier[i]);
      }
    jusqu'ici tout se passe bien et l'affichage est impécable.
    J'ai récupere l'ensemble et uniquement ceux là, des noms de fichiers du repertoire dont le chemin est spécifié dans directory.
    Ils sont contenus dans dossier et m traduit le nombre de ces fichiers ...

    Je cherche desormais à effectuer une vérification sur ces fichiers, c'est a dire verifier la presence d'un mot clé à l'interieur.Je crée donc une fonction verifie dont voici le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int verifie (const char*);
    en lui passant pour argument le nom du fichier à vérifier concatené au nom du dossier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char buffer[512];
     
    for (int i=0; i<m; i++)
    {
     strcpy(buffer, directory);
     strcat(buffer,"/");
     strcat(buffer, dossier[i]);
     
     printf("verification de %s\n",dossier[i]);
    }
    et j'ai un gros plantage, des caracteres speciaux apparaissent ... !?
    De ce fait impossible d'ouvrir le fichier et de vérifier quoique ce soit.

    Est ce que quelqu'un à déja eu ce problème ?
    Et comment l'a t-il résolu ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    A chaque fin d'itération de la boucle for il ne faut pas vider buffer ?

  3. #3
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    non sinon j'obtiens un free corruption puisque buffer est déclaré en statique,
    strcpy se chargera d'ecraser les données contenues dans buffer et le remplira puis apres avoir positionné '\0' completera avec des 0 si il reste de la place

    enfin je crois ...

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Poste un code qui compile et qui reproduit l'erreur.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    C'est bon j'ai remplacé le "strcpy" par un "snprintf" et je n'ai plus de perturbations.
    Merci.

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

Discussions similaires

  1. Fonction scandir() avec PHP5
    Par maty2006 dans le forum Langage
    Réponses: 8
    Dernier message: 07/12/2008, 11h42
  2. Passage d'une structure en fonction
    Par god_enel dans le forum C
    Réponses: 11
    Dernier message: 15/04/2007, 20h55
  3. structures et fonctions
    Par olivier1209 dans le forum C
    Réponses: 11
    Dernier message: 10/12/2006, 14h53
  4. Structure et fonction
    Par progfou dans le forum C
    Réponses: 7
    Dernier message: 04/07/2006, 14h23
  5. structures et fonctions
    Par kendras dans le forum C
    Réponses: 15
    Dernier message: 14/06/2006, 15h57

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