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 :

Vérifier l'extension d'un fichier passé en argument [Débutant(e)]


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Vérifier l'extension d'un fichier passé en argument
    Bonjour,

    J'ai écrit un programme qui prend en entrée en argument un fichier au format .glv.
    Néanmoins j'aimerai que l'exécution du programme se termine si on donne en argument un fichier qui a une mauvaise extension.
    Je pensais que ce bout de code remplissait cette tache:

    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
    int verifieExtension(char s[]) // verifie si on passe en argument un fichier cyber .glv
    {
        int j;
        int cpt =strlen(s);
        for (j = 0; j < cpt-3; j++)
        {
           if ((s[j] = "g") && (s[j+1] = "l") && (s[j+2] = "v"))
           {
              return 1;
           }
       }
       return 0;     
    }
     
    int main(int argc, char *argv[])
    {	
      /** ... **/
     
       // Si fichier donne en argument pas au format .glv: sortie
       if (verifieExtension(argv[1]) == 1) 
       {
          printf("format de fichier non correct: .glv accepte seulement\n");
          exit(EXIT_FAILURE);
       }
     
      /** ... **/
     
      return 0;
    }
    Mais le compilateur me met en erreur:
    "invalid conversion from `const char*' to `char' ". au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((s[j] = "g") && (s[j+1] = "l") && (s[j+2] = "v"))
    J'ai beau retourner le problème, mais je n'arrive pas à savoir comment le résoudre. Si vous pouviez m'éclairer, merci

  2. #2
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Essaie avec des ' ' plutôt que des " " qui indiquent une chaine quand tu ne testes qu'un caractère.

    Ah, et aussi : Pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((s[j] = "g") && (s[j+1] = "l") && (s[j+2] = "v"))
    Mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((s[j] == 'g') && (s[j+1] == 'l') && (s[j+2] == 'v'))
    == pour un test, = pour une assignation...

    Ca devrait aller mieux. (Pas regardé le reste du code par contre, mais je crois que je vais le faire quand même ^^)

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Il y a franchement plus simple pour retrouver l'extension ! Tu fait une recherche par exemple du . qui commence l'extension avec la fonction strrchr puis tu compares la chaîne à partir de ce pointeur !

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par willem77
    Mais le compilateur me met en erreur:
    "invalid conversion from `const char*' to `char' ". au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((s[j] = "g") && (s[j+1] = "l") && (s[j+2] = "v"))
    J'ai beau retourner le problème, mais je n'arrive pas à savoir comment le résoudre. Si vous pouviez m'éclairer, merci
    Le mien est nettement plus bavard...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `verifieExtension':
    main.c:4: warning: implicit declaration of function `strlen'
    main.c:7: warning: assignment makes integer from pointer without a cast
    main.c:7: warning: assignment makes integer from pointer without a cast
    main.c:7: warning: assignment makes integer from pointer without a cast
    main.c: In function `main':
    main.c:22: warning: implicit declaration of function `printf'
    main.c:23: warning: implicit declaration of function `exit'
    main.c:23: error: `EXIT_FAILURE' undeclared (first use in this function)
    main.c:23: error: (Each undeclared identifier is reported only once
    main.c:23: error: for each function it appears in.)
    main.c: At top level:
    main.c:15: warning: unused parameter 'argc'
    Process terminated with status 1 (0 minutes, 1 seconds)
    3 errors, 7 warnings
    Tu devrais poster du code complet. On ne sais pas ce que tu as réellement oublié...

    Ceci compile et fonctionne (de façon naïve)
    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
     
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int verifieExtension (char s[]) // verifie si on passe en argument un fichier cyber .glv
    {
       int j;
       int cpt = strlen (s);
       for (j = 0; j < cpt - 3; j++)
       {
       }
     
       if ((s[j] == 'g') && (s[j + 1] == 'l') && (s[j + 2] == 'v'))
       {
          return 1;
       }
       return 0;
    }
     
    int main (int argc, char *argv[])
    {
       if (argc > 1)
       {
          // Si fichier donne en argument pas au format .glv: sortie
          if (verifieExtension (argv[1]) != 1)
          {
             printf
                ("'%s' : format de fichier non correct: .glv accepte seulement\n",
                 argv[1]);
             exit (EXIT_FAILURE);
          }
       }
     
       return 0;
    }
    Pose des questions si tu ne comprends pas (et cesse de confondre ' et ").

    Ce code a un comportement indéfini si le nom du fichier fait moins de 3 caractères. Il faut considérablement renforcer l'algorithme.

    Il faut aussi être plus clair avec la définition.

    Ceci est-il acceptable : fichier.glv.txt ?

    bref, le vrai boulot commence...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 100
    Points
    100
    Par défaut
    il me semble que cela aussi devrait passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(&s[j], ".glv") == 0)
    vous confirmez ?

    ps : pour strlen il faut inclure <string.h>, pour printf inclure <stdio.h>, pour exit inclure <stdlib.h> et cela devrait compiler sans erreur avec cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((s[j] == 'g') && (s[j+1] == 'l') && (s[j+2] == 'v'))

  6. #6
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Je confirme que oui normalement ^^

    Un truc possible, sans chercher à vraiment optimiser ou quoi que ce soit, si on a inclut ce qu'il faut :

    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
    int verifieExtension(char s[]) 
    {
        int j;
     
        if (strlen(s) > 4) //Vérifie si on a au moins 5 caractères dans le nom du fichier...
        {
           for (j = 0; s[j + 3]; j++)
           {
              if (!strcmp(&s[j], ".gls"))
              {
                 return 1;
              }
           }
        }
       return 0;     
    }

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ma solution proposée plus haut ne serait-elle pas mieux !?!?

    Je ne propose cependant pas le code car vu qu'il débute, il serait bon qu'il tente au moins de faire le travail lui même et de nous le proposer ici pour qu'on vois !

  8. #8
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Franck.H
    Ma solution proposée plus haut ne serait-elle pas mieux !?!?
    Si en effet ^^ Mais je l'avais zappée, et je voulais reprendre le principe qu'il avait écrit au départ... Mais finalement, j'ai pas pu m'empecher de corriger plus que prévu

    Pour le code, je sais pas, il y avait un code à la base, et pas mal de choses à redire, donc j'ai proposé quelque chose... J'aurais peut-être du m'abstenir. Ca sera pour la prochaine fois. willem77, néanmoins, je te conseille de coder ce qu'a proposer Franck.H et de le tester. Ca sera plus propre, et ca tiens en 4 ou 5 lignes...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci de toutes vos réponses

    effectivement ça ne marchait pas juste à cause des double quotes... j'ai pas été malin sur ce coup là...
    Sinon je n'avais pas oublié d'inclure les différents headers, après c'est sûr que le compilateur de devcpp n'est pas très verbeux...

    Donc je retiens la solution de Franck.H qui est plus esthétique que celle que j'ai utilisée à la base

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
     
    int verifieExtension(char s[]) // verifie si on passe en argument un fichier cyber .glv
    {
       char *extension;
       extension = strrchr(s,'.'); 
     
       if ((extension[0] == '.') && (extension[1] == 'g') && (extension[2] == 'l') && (extension[3] == 'v'))
       {
          return 1;
       }
       return 0;
    }
     
    //------------------ MAIN ---------------------
    int main(int argc, char *argv[])
    {	
       // Si fichier donne en argument pas au format glv: sortie
       if (!(verifieExtension(argv[1])))
       {
          printf("format de fichier non correct: .glv accepte seulement\n");
          Sleep(5000);
          exit(EXIT_FAILURE);
       }
     
       return 0;
    }
    J'incluerai par la suite les différentes optimisations que vous avez proposées et auxquelles je n'ai pas pensé!

    Encore merci à tous

  10. #10
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((extension[0] == '.') && (extension[1] == 'g') && (extension[2] == 'l') && (extension[3] == 'v'))
    Après relecture, penser à tester extension en plus.
    Euh... strcmp ? Enfin, là, c'est comme tu veux, mais ca réduit la ligne à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (extension != NULL && !strcmp(extension, ".gls"))
    Mais bon, ca change rien, juste que vala, y'a des fonctions qui le font toutes seules... Et comme ca, si tu dois changer d'extension, une macro ou une petite modif et ca marche tout seul

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon bin voici ma fonction, je ne sais pas si tu l'as fait mais la voici:

    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
    static int verifieExtension (const char * filename, const char * extension)
    {
       int ret = 0;
     
       if (filename != NULL && extension != NULL)
       {
          char * p = strrchr (filename, '.');
     
          if (p != NULL)
          {
             if (strcmp (++p, extension) == 0)
             {
                ret = 1;
             }
          }
       }
     
       return ret;
    }
    L'extension est ici à fournir sans le . (point) !

  12. #12
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Code Windows : _splitpath (stdlib.h)

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

Discussions similaires

  1. Vérifier l'extension d'un fichier
    Par Ryuk- dans le forum Développement de jobs
    Réponses: 12
    Dernier message: 22/05/2012, 15h31
  2. Tester le type d'un fichier passé en argument
    Par Nudge dans le forum Linux
    Réponses: 2
    Dernier message: 03/10/2011, 21h22
  3. Vérifier l'extension et le format d'un fichier image
    Par tagada_tagada dans le forum Langage
    Réponses: 7
    Dernier message: 19/11/2008, 03h59
  4. Réponses: 3
    Dernier message: 24/06/2004, 11h23
  5. [XSLT] Probleme de fichier passé en URL
    Par jean.lamy dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 07/05/2004, 17h48

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