Forum Programmation.c traitement selon le nom du fichier

Posté par  .
Étiquettes : aucune
0
23
juin
2005
comment faire en C une boucle qui traite seulement les fichiers dont le nom respect la syntaxe suivante : FFF_sequence_tmp
avec :
sequence : 0001,0002,0003,...
genre :

for file in (FFF_xxxx_tmp) //les fichier dans le repertoire courant
do
// traitement
done

est ce qu'il n'y a pas quelque chose comme les expressions régulières ?
merci
  • # PCRE

    Posté par  . Évalué à 3.

    Pour les expressions rationnelles il y a: www.pcre.org
    Pour la lecture de fichiers il faut jouer avec opendir, readdir, fopen, fcloser et closedir
  • # bash

    Posté par  . Évalué à -1.

    Tu fais un scriptz en bash et tu appelles ce script dans ton programme en C par la fonction system. Car c'est connu pour un programme en C plus tu fais appel a la fonction system, mieux c'est.
  • # C

    Posté par  . Évalué à 1.

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <dirent.h>
    
    int main(int argc, char **argv) {
    
      struct dirent* entry;
      DIR* directory;
      char* file;
      int length;
    
      if(directory = opendir(".")) {
        while(entry = readdir(directory)) {
          printf("%s\t\t", (file=entry->d_name));
          length = strlen(file);
    
          if(length==12 && !strncmp(file,"FFF_",4) && 
    	 !strncmp(&file[length-4],"_tmp", 4) &&
    	 !( *(file+length-4)=0 ) &&
    	 (atoi(&file[4]) || !( *(file+length-4)='_' ))) {
    
    
    	// traitement sur le fichier ici ...
    	printf("OK\n");
    
          } else {
    
    	printf("BAD\n");
    
          }
    
        }
        closedir(directory);
      }
      
      return 0;
    }
    
    Quelques explications (si nécessaires):
    • en C y'a pas vraiment de booléens, juste 0 pour false et tout le reste pour true
    • toute affectation "retourne" une valeur, celle qui a été affectée à la variable à gauche de l'expression, ainsi (i=6) vaut 6, ce qui autorise a=(b=6) pour donner a=6 et b=6
    • l'expression suivant un && n'est évaluée que si l'expression située avant est true (!= 0)
    • l'expression suivant un || est évaluée quelque soit la valeur de l'expression située avant
    Ainsi: !( *(file+length-4)=0 ) remplace le dernier '_' par '\0' et renvoie !0 donc true, atoi(&file[4]) renvoie true uniquement si la séquence est un chiffre non nul, et !( *(file+length-4)='_' ) remet en place le '_' en renvoyant false pour ne pas interférer dans le résultat de atoi(). A+, Jay
    • [^] # Re: C

      Posté par  . Évalué à 0.

      c'est ce que je chercher
      Merci
    • [^] # Re: C

      Posté par  . Évalué à 3.

      l'expression suivant un || est évaluée quelque soit la valeur de l'expression située avant
      L'expression suivant un || est évalué lorsque l'expression précédente est fausse. Si la première expression est vrai, dans le cas d'un OU Logique, on est sûr que l'expression entière sera vrai.

      Les expressions reliées par && ou || sont évaluées de gauche à droite, et il est garanti que l'évaluation s'arrête dès que la véracité ou la fausseté de l'expression est déterminée.
      Extrait du K&R.
      • [^] # Re: C

        Posté par  . Évalué à 1.

        Autant pour moi (et merci pour ces présicions). Je n'ai d'ailleurs pas vu le problème puisque j'affiche le nom de fichier avant le test. L'expression atoi(&file[4]), quand elle est vraie, empêche le remplacement de '\0' par '_' ;-( car jamais évalué! Avec une variable de plus, on devrait pouvoir faire (non testé!):
        int isnum;
        
        if(length==12 && !strncmp(file,"FFF_",4) && 
        	 !strncmp(&file[length-4],"_tmp", 4) &&
        	 !( *(file+length-4)=0 ) &&
        	 (isnum=atoi(&file[4]) || 1) &&
        	 ( *(file+length-4)='_' ) && isnum) {
        
        	// traitement sur le fichier ici ...
        
        (isnum=atoi(&file[4]) || 1) est toujours vraie et remplit isnum avec 1 si la séquence est un nombre, ( *(file+length-4)='_' ) remplace le '\0' par le '_' et renvoie toujours vrai et le teste se termine avec isnum. Voilà :-) /!\ si la séquence peut valoir 0000, le test échoue alors que le nom de fichier est valide, il faut rajouter un bout de test du genre ($file[length-5] == '0' || ...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.