2014-12-24 11 views
9

Sto sviluppando un aggiornamento in un programma esistente. Sto sostituendo Posix's getopt_long() con boost :: program_options. Ma il mio lavoro non funziona come avrei dovuto: voglio avere argomenti leggere come:C++ boost :: program_options lettura argomenti compatibili con getopt_long

-server=www.example.com 
-c config.txt 

stavo cercando molte possibilità da boost :: :: program_options command_line_style, ma non riesco a trovare le combinazioni che avrebbe dare un comportamento uguale a getopt_long.

ho scoperto che per gli argomenti:

-server=www.example.com 

ho bisogno di bandiere:

command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent 

ma ho problemi con le bandiere fondatori per:

-c config.txt 

ho scoperto che le bandiere:

command_line_style::allow_short | command_line_style::allow_dash_for_short | command_line_style::short_allow_next 

dammi quasi quello che voglio. Quasi perché:

ProgramOptionsParserTest.cpp:107: Failure 
Value of: params.config 
    Actual: " config.txt" 
Expected: expectedParams.config 
Which is: "config.txt" 

quindi, dopo aver usato boost :: algorithm :: trim() sarà come voglio.

Quindi la mia domanda è: è possibile gestire argomenti come -c config.txt con boost :: program_options ma senza boost :: algorithm :: trim()?

EDIT Ho notato che i flag sopra non funzionano con argomenti non registrati. opzioni che ho registrati:

programOptionsDescription.add_options() 
     ("help,h", "display help message") 
     ("config,c", value<std::string>(), "use configfile") 
     ("server,s", value<std::string>(), "server") 
     ("ipport,p", value<uint16_t>(), "server port"); 

ma quando ho utilizzare le opzioni non registrati (sì, ho basic_command_line_parser :: allow_unregistered()):

-calibration=something 

vedo:

the argument ('alibration=something') for option '-config' is invalid 

mio domanda dopo edizione: come gestire gli argomenti che funzionano con getopt_long con boost :: program_options?

risposta

1

Se si utilizza boost::program_options, il simbolo '=' è necessario per analizzare correttamente i parametri. Lancia un'eccezione se manca. A proposito, lo boost::property_tree è anche un'ottima scelta per analizzare i file di configurazione. Codice:

#include <iostream> 
#include <boost/propery_tree.hpp> 
#include <boost/propery_tree/ini_parse.hpp> 
int main() 
{ 
    string filename("test.conf"); 
    boost::property_tree::ptree parser; 
    boost::property_tree::ini_parser::read_ini(filename, parser); 
    const string param_1 = parser.get<string>("DEFAULT.-server"); 
    const string param_2 = parser.get<string>("DEFAULT.-c"); 
    cout << param_1 << ' ' << param_2 << endl; 
    return 0; 
} 

Il "DEFAULT" è nome della sezione del file di configurazione. Puoi provarlo.

+0

Immagino che questa risposta non sia correlata. La domanda è chiaramente finalizzata all'analisi delle opzioni del programma (posix getopt() ecc.) – user23573

Problemi correlati