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 :

[c++]Quel code avoir pour utiliser les arguments en ligne de commande?


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut [c++]Quel code avoir pour utiliser les arguments en ligne de commande?
    Salut,

    Je souhaite executer mon programme, on va dire "calculelimage.exe" avec l'option -c par exemple.

    Donc "calculelimage.exe -c" dans le raccourci windows.

    or ce que je souhaite faire, c'est specifier dans mon code:

    Si "-c" alors fait ca, sinon fait ca...


    J'ai bien un bout de code me disant:

    {code:}
    #include <fstream.h>

    main(int argc, char argv[])
    {
    ifstream fin;
    ofstream fout;
    if (argc!=3) {
    cerr << "usage blabla \N"; exit(1);}

    fin.open(argv[1]);
    fout.open(argv[2]);

    if(!fin)
    {cerr...
    blabla


    Or je ne comprends pas!

    ce "ouvre un stream fin blabla"... je ne veuix pas ouvrir de stream, je veux juste verifier avec quels arguments on a a ppeler mon progrmme??

    Je precise que ce code se trouve dans le main de mon programme, celui qui en version "monprogramme.exe -c" est censer agir differement qu'en "monprogramme.exe"...


    Merci!!

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Je te fais une version à la C :

    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
     
    #include <cstring>
     
    /*argc, c'est le nombre d'argument passé en paramètre,
      argv est un tableau vers les éléments passés en paramètre,
      argv[0] est le nom du programme appelant*/
    int main(int argc, char* argv[])
    {
     if(argc==2 && strcmp(argv[1], "-c")==0)
     {
      /*execute quand il y a l'option -c*/
      ...
     }
     else
     {
       /*les autres cas*/
     }
     
      ...
     return EXIT_SUCCESS;
    }
    Je ne répondrai à aucune question technique en privé

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Utilisation de ARGV
    Essayes un truc comme ça, et tu comprendras ce qu'il y a dans argv[] (attention il y aura une différence entre le monde unix et windows!) ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    #include <fstream.h>
     
    main(int argc, char argv[])
    {
    ....
     
    for(int i=0; i< argc;i++){
       cerr << argv[i];
    }
     
    ...
    Bye

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    merci de ta reponse rapide!!

    Alors jai essayé,
    deja il faut mettre une parenthese la:
    if(argc==2 && strcmp(argv[1], "-c") )
    Elle a été oubliee!
    (je dis cela seulement si quelqu'un relit notre code et ne comprends pas l'erreur! )

    Ensuite,
    il n'aime pas quand j'ecrit comme toi "-c"... il semble accepter le "c" simplement, sans le tiret.
    Je vais verifier tout cela desuite!!


    Merci en tout cas cela m'a beaucoup aidé!

  5. #5
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    pourquoi ne pas tout simplement faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char *argv[]) {
     if (argc == 2 && argv[1] == "-c") {
      instructions
     } else {
      instructions
     }
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par NewDid
    Essayes un truc comme ça, et tu comprendra ce qu'il y a dans argv[] (attention il y aura une différence entre le monde unix et windows!) ...

    Bye

    Merci! oOPS, CAR JE fait mon code sous windows (avec visual c++ version 6.0) et je devrais faire la presentation sous unix...
    Je pensais que j'allais m'envoyer le code en texte par email, et le recopier/ recompiler a l'université sous Unix!!

    Mais si le code est different... aie!!

  7. #7
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par NewDid
    Essayes un truc comme ça, et tu comprendras ce qu'il y a dans argv[] (attention il y aura une différence entre le monde unix et windows!) ...
    sous unix argv[0] retourne le chemin vers l'application et il me semble que sous windows c'est la même chose ? à part peut-être que sous win il n'y a que le nom de l'application qui soit retourné. Sinon pour le reste ça doit être la même chose.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par alceste
    pourquoi ne pas tout simplement faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char *argv[]) {
     if (argc == 2 && argv[1] == "-c") {
      instructions
     } else {
      instructions
     }
    }

    Salut!!

    Alors merci, mais cela ne fonctionne pas!!


    Cela n'affiche mon output simplement si je met ce code:

    if(argc==2 && strcmp(argv[1], "-c") )
    Et si je supprime le " -"

    Donc:

    if(argc==2 && strcmp(argv[1], "c") )



    ecrire if (argc == 2 && argv[1] == "-c") {
    cout << "test";
    }
    n'affichera rien/....

    Test ne s'affiche qu'avec "if(argc==2 && strcmp(argv[1], "c") )"


    Allez savoir pourquoi!!?

  9. #9
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut,
    Citation Envoyé par Alceste
    pourquoi ne pas tout simplement faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char *argv[]) 
    { 
        if (argc == 2 && argv[1] == "-c") 
         { instructions } 
       else 
         { instructions }
     }
    car tu compares un pointeur a un aute pointeur et ces deux pointeurs ne pointent pas du tout sur la même chose.
    argv[1] pointe sur "-c" de la ligne de commande et "-c" pointe a un autre endroit (je ne sais plus exactement lequel, je crois que c'est l'endroit ou tu as les variables constantes).

    Si tu veux que lorsqu'on ecrit :
    tonprog.exe -c
    cela affiche test il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (argc == 2 && !strcmp(argv[1], "-c")) {
    cout << "test";
    }
    Car strcmp renvoie 0 si les 2 chaines sont egales (ie faux).
    b Oo

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    merci,

    Juste une question!

    cela signifit quoi:

    argc == 2?

    J'ai bien compris que argv[0] est le nom du programme, et argv[1]..seront les arguments a la suite!


    Merci!

  11. #11
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    argc c'est le nombre de paramètres.
    Donc ici 2, si tu passes :
    tonProg.exe
    c'est 1,
    etc ...
    b Oo

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Tout simplement, argc, c'est le nombre d'arguments passés à la commande (qui est le premier argument passé à la fonction main) et qui permet de retrouver les autres...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int main(int argc, char* argv[])
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par b Oo
    argc c'est le nombre de paramètres.
    Donc ici 2, si tu passes :
    tonProg.exe
    c'est 1,
    etc ...
    ha okay, merci!
    Et dans le cas ou j'aurai genre dix parametres, il vaux mieux que jecrive argc=10 alors!!!

    Jai onze differents parametres je crois!!

    Est ce que cela pose un probleme de declarer un argc plus grand que le reel nombre de parametres?

    MErci!

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il y a des bibliothèques pour ça.
    Comme boost program_options.
    Boost ftw

  15. #15
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Ben tu ne le déclares pas, c'est fais automatiquement.
    Tu peux penser que tu auras 100 paramètres dans ton main.
    Et tu fais un compteur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     while (++i < argc)
      { }
    Il y a une fonction aussi qui permet de trouver la liste des paramètres mais je ne l'ai plus en tête.
    b Oo

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Donc t'avais pas compris mon post, j'aurais du etre plus explicite, avec un commentaire plus complet .
    En plus de te montrer la signification de argc, la boucle te montre toutes les valeurs dans argv .
    Bye

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par NewDid
    Donc t'avais pas compris mon post, j'aurais du etre plus explicite, avec un commentaire plus complet .
    En plus de te montrer la signification de argc, la boucle te montre toutes les valeurs dans argv .
    Bye
    hehe!

    merci!
    non en effet, apres relecture, je comprends...ca affichera tout les arguments, c'est ca?
    Le truc c'est que je debute et que j'ai peur de m'y perdre dans tout ces codes...
    du coup jai pas essayer cette commande la!

    jai un programme a faire avec 13 diffrentes lignes de commandes en parametres chacunes etant plus chian...complexes que les autres!!

    genre ouvrir une image 256*256 avec 256 diffrentes valeurs de gris, et si tu lance le programme.exe avec "-c" ca calcule et affiche la valeur de gris la plus courante....
    13 differents trucs comme ca...

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    regarde du coté de boost::program_option
    c'est trestres complet

  19. #19
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par loufoque
    Il y a des bibliothèques pour ça.
    Comme boost program_options.

  20. #20
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, il faudra de toutes facons travailler par étapes (mais peut etre la bibliotheque boost::progam_option t'aidera-t-elle)

    La première est de toutes manières de vérifier la validité des parametres passés en ligne de commande:

    Ensuite, il convient peut etre de veiller à interpréter les parametres dans leurs ensemble...
    • La gestion de certains parametres doit peut-etre prise en compte avant d'autre (savoir si le résultat du traitement A envoyé dans le traitement B fournira le meme résultat que si on envoie B dans A), indépendemment de l'ordre d'introduction des arguments
    • Certains arguments prennent le pas sur tous les autres (typiquement: la demande d'affichage de l'aide, qui empechera toute autre exécution des parametres éventuellement rajoutés)
    • Les parametres nécessitant une information complémentaire devront etre traités avec cette information (et il s'agira de ne pas essayer de traiter l'information complémentaire "toute seule")
    • ...

    Le but sera de créer une "liste d'exécution" des différents parametre à effectuer, puis de faire les appels correspondant dans le bon ordre...

    Evidemment, ces deux listes ne se veulent surement pas exhaustives... Ce sont plus des exemples propre à orienter ta réflexion pour déterminer le tout qu'autre chose ... d'autant plus que je ne connais absolument pas boost::progam_option et que, si ca se trouve, elle permet d'automatiser ce genre de choses
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/08/2012, 14h36
  2. [EJB] Quelles bonnes pratiques pour utiliser les transactions "en ligne"?
    Par kisitomomotene dans le forum Java EE
    Réponses: 1
    Dernier message: 12/12/2011, 20h22
  3. Quels modules Perl pour gérer les documents XML ?
    Par djibril dans le forum Modules
    Réponses: 8
    Dernier message: 02/12/2010, 23h54
  4. Réponses: 1
    Dernier message: 30/06/2006, 15h49
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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