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 :

Passage d'arguments en ligne de commande : bizarrerie


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Passage d'arguments en ligne de commande : bizarrerie
    Bonjour, j'ai un petit soucis avec mon parseur d'options. Il marchait bien a priori et là je veux rajouter une option -g [size] ou --generate [size] avec comme valeur par défaut 9 (sil n'y a pas d'argument pour -g donc).

    Le programme prend forcément un argument qui est le fichier à ouvrir, -o est là pour rediriger le résultat vers un fichier au lieu de stdout.
    Normalement,
    ./mon_programme fichier -o out.txt -g 4
    ne met pas size à 4 mais laisse size à 9 (comportement par défaut), alors que
    ./mon_programme fichier -o out.txt -g4
    et ./mon_programme fichier -o out.txt --generate=4
    font ce qu'il faut.

    Le code :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    int main(int argc, char* argv[])
    {
      const struct option long_options[]= /*to specify long options*/
      {
        {"help",0,NULL,'h'},
        {"version",0,NULL,'V'},
        {"verbose",0,NULL,'v'},
        {"output",1,NULL,'o'},/*output has an argument in which results
    			    will be stored*/ 
        {"generate",2,NULL,'g'},/*optional size argument, default=9*/
        {NULL,0,NULL,0}
      };
      program_name=basename(argv[0]);
      out_file=stdout;
      int optc;
     
      while ((optc=getopt_long(argc, argv, "hVvo:g::",long_options,NULL))!=-1)
        {
          switch(optc) /*to consider the different options*/
    	{
    	case 'h':
    	  usage(EXIT_SUCCESS);
    	  break;
    	case 'V':
    	  version();
    	  break;
    	case 'v':
    	  verbose=true;
    	  break;
    	case 'o':
    	  out_file=fopen(optarg,"w+");
    	  if (out_file==NULL) /*to treat the case when the file can't
    			      be opened*/
    	    {
    	      fprintf(stderr,"Error : the file %s cannot be opened !\n",optarg);
    	      usage(EXIT_FAILURE);
    	    }
    	  break;
    	case 'g':
    	  if(optarg)
    	    {
    	      grid_size=atoi(optarg);
    	      fprintf(out_file,"argument %s\n",optarg);
    	    }
    	  else
    	    {
    	      grid_size = 9;
    	      fprintf(out_file,"size = %d\n",grid_size);
    	    }
    	  fprintf(out_file,"option g\n");
    	  break;
    	default:
    	  usage(EXIT_FAILURE);
    	}
        }
     
     
     
      if (optind>=argc) /*tests the presence of argument in line command*/
        usage(EXIT_FAILURE);
     
     
      FILE* grid_file;
      grid_file=fopen(argv[optind],"r");
     
      if(grid_file==NULL)
        {
          fprintf(stderr,"Error : the file %s cannot be opened !\n",argv[optind]);
          usage(EXIT_FAILURE);
        }
    Si vous voyez l'erreur, le programme se poursuit après bien sûr.
    (Je n'ai pas trouvé comment garder l'indentation du code, si vous savez comment faire ça serait déjà plus agréable à lire. ^^)
    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    C'est décrit dans la doc :

    Un double deux points (« :: ») signifie qu'une option prend un argument optionnel. S'il existe un texte dans le même élément de argv (c'est à dire dans le même mot que l'option elle-même comme « -oarg ») alors il est renvoyé dans optarg, sinon optarg est défini à zéro. Il s'agit d'une extension GNU.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ah si j'ai bien compris c'est tout bête ... je vais essayer ça alors, merci

Discussions similaires

  1. Réponses: 27
    Dernier message: 14/12/2006, 19h49
  2. Entrer un argument en ligne de commande
    Par alex_petit dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/12/2006, 00h11
  3. [VB.NET]Argument en ligne de commande
    Par Fayoul dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/06/2006, 12h27
  4. taille max des arguments en ligne de commande
    Par clepape dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2005, 13h18
  5. Réponses: 3
    Dernier message: 07/04/2003, 20h06

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