2017-09-21 6 views
1

Pour C++, comment accepter les arguments CLI ou stdin? Par exemple, disons que j'ai une fonction foo() que je veux appeler sur un nombre variable d'arguments. Par exemple, disons que j'ai une fonction foo(). Pour args standards, j'utilise simplement quelque chose comme:Modèle de conception pour accepter les arguments stdin OU CLI

int main(int argc, char* argv[]) { 
    if (argc < 2) { 
     std::cout << "usage goes here.\n"; 
    } else { 
     for (int i; i < argc; ++i) { 
      foo(argv[i]); 
     } 
    } 
} 

Mais s'ils me les a envoyées via stdin et canalisé les paramètres à ma demande? Existe-t-il un moyen de détecter et d'accepter/gérer les deux? Qu'est-ce qu'un modèle de conception efficace pour faire cela en C++ moderne (C++ 11 et au-delà)?

Je suis intéressé par le modèle de conception/mise en œuvre de l'échantillon. N'hésitez pas à faire référence à une bibliothèque qui le fait (Boost?) Mais s'il vous plaît partager/expliquer un exemple de mise en œuvre.

Répondre

2

Normalement, vous ne pouvez lire que en entrée à partir de stdin, pas d'arguments/options. En lisant et en évaluant les arguments/options, le programme devrait décider s'il attend une entrée de stdin ou par ex. un argument de fichier.

Comme exemple de la manpage of grep:

Synopsis

grep [OPTIONS] MODÈLE [FICHIER ...]

Description de

grep recherche l'entrée du nom FICHIERS (ou entrée standard si sans fichiers sont nommés, ou si un seul trait d'union (0) est donné comme nom de fichier) pour les lignes contenant une correspondance au PATTERN donné.

Un manque de l'argument de fichier ou l'option - indique grep lire stdin.

Invokation de votre programme pourrait ressembler à cela, l'absence de l'argument du fichier indique l'entrée lecture de stdin:

# file argument, input is in the file 
command -o someoption filename 

# file content supplied via stdin 
command -o someoption < filename  

# with pipe and - (stdin) as file argument 
othercommand | command -o someoption - 

Pour l'analyse des options/arguments Boost a le program options library

+1

J'ai essayé upvoting mais je suis trop Nouveau. Marqué comme accepté. Je vous remercie. –