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 :

Question sur le string matching


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Par défaut Question sur le string matching
    Bonjour à tous,

    Je souhaite parcourir les fichiers d'un répertoire donné par l'utilisateur et ne charger que les fichiers avec une extension spéciale (exemple .flv).

    j'ai fait cette petite fonction de test (avec ce que j'ai trouvé sur le net) mais le résultat n'est pas bon soit tout match soit rien ne match:

    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
     
    # define INPUT_FILE_FILTER_PATTERN "flv$"
     
    if(strcmp(".",ep->d_name) != 0 && strcmp("..",ep->d_name) !=0 ){
    				err = regcomp (&preg, INPUT_FILE_FILTER_PATTERN, REG_NOSUB | REG_EXTENDED | REG_NEWLINE | REG_ICASE);
    				if (err == 0) // compilation ok
    				{				
    					match = regexec (&preg, INPUT_FILE_FILTER_PATTERN, 0, NULL, 0);
    					regfree (&preg); // free memory
     
    					if (match == 0)
    					{
    						printf("-> %s\n",ep->d_name);
    					}else if (match == REG_NOMATCH){ // not match
    							printf("not match -> %s\n",ep->d_name);
    					}
     
    				}else{
    					char *text;
    					size_t size;
     
    					size = regerror (err, &preg, NULL, 0);
    					text = malloc (sizeof (*text) * size);
    					if (text)
    					{
    						regerror (err, &preg, text, size);
    						fprintf (stderr, "%s\n", text);
    						free (text);
    					}else {
    						fprintf (stderr, "Memoire insuffisante\n");
    						exit (EXIT_FAILURE);
    					}
    				}
    j'ai aussi fait cette autre fonction ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    				if(fnmatch(INPUT_FILE_FILTER_PATTERN, ep->d_name, FNM_NOESCAPE | FNM_CASEFOLD) == 0){
    					printf("match -> %s\n",ep->d_name);					
    				}else{
    					printf("not match -> %s\n",ep->d_name);
    				}
    mais à la compilation j'ai cette erreur :

    error: ‘FNM_CASEFOLD’ undeclared (first use in this function)
    Merci beaucoup pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Par défaut
    je pense avoir déjà un début de piste, en fait c'est la variable statbuf qui garde les informations du premier fichier et pas les autres.

    voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (ep = readdir (dp)){ // je passe les fichiers un par un
         if(lstat(ep->d_name,&statbuf) < 0 ){
             printf("error lstat  %s \n",ep->d_name);
              break;
         }
         printf("File name: \t\t%s\n",ep->d_name);
         printf("File inode: \t\t%d\n\n",statbuf.st_ino);
    }
    le resultat :

    File name : example.c
    File inode: 10547188

    File name : test1.txt
    File inode: 3326058 <=

    File name : test2.doc
    File inode: 3326058 <=

    File name : test3.dat
    File inode: 3326058 <=
    Avez vous une idée ?

    Merci beaucoup pour votre aide
    Cordialement

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 062
    Billets dans le blog
    143
    Par défaut
    Bonjour,

    Pour tester le type du fichier j'y serai allé à la méthode barbare soit:
    - Test des 4 derniers caractères du nom du fichier, pour voir, s'il correspondent à '.flv'

    Ce qui me parait presque plus simple que les expression régulière
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    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
    LittleWhite :
    - Test des 4 derniers caractères du nom du fichier, pour voir, s'il correspondent à '.flv'
    C'est effectivement simple à mettre en oeuvre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      char name[]= "xxx.yyy.flv";
      char ext[] = ".flv";
     
      char * p = strrchr(name,'.');
      if(p!=NULL && strcmp(p,ext)==0) printf("Fichier %s\n", ext);
      else printf("Fichier pas %s\n",ext);

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Par défaut
    Merci beaucoup pour votre aide.

    J'ai finalement trouvé le problem et voici le code qui marche /

    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
     
    char * fullFilePath;
    regex_t preg;
    #define  INPUT_FILE_FILTER_PATTERN "^[.](flv)|(FLV)$"
    ...
    ...
     
    err = regcomp (&preg, INPUT_FILE_FILTER_PATTERN, REG_EXTENDED | REG_NEWLINE | REG_ICASE);
    if (err == 0) // compilation ok					{
       int match = regexec (&preg, fullFilePath, 0, NULL, 0);
       regfree (&preg); // free memory
       if (match == 0){
    	printf("->Found File %s\n\n",fullFilePath);
       }
    ...
    ...	
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2009, 11h08
  2. Question sur passage String Integer
    Par fatenatwork dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 13/03/2008, 11h45
  3. [stl] questions sur la classe string
    Par r0d dans le forum SL & STL
    Réponses: 3
    Dernier message: 23/02/2007, 00h31
  4. Question sur le type String
    Par bugland dans le forum Langage
    Réponses: 9
    Dernier message: 12/02/2007, 13h47
  5. Question sans prétention sur un String
    Par arsenik7 dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2006, 08h44

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