2014-12-24 10 views
9

Ich entwickle ein Update in einem bestehenden Programm. Ich ersetze Posix's getopt_long() mit boost :: program_options. Aber meine Arbeit nicht funktioniert, wie ich sollte:C++ boost :: program_options lesen Argumente kompatibel mit getopt_long

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

ich viele Möglichkeiten von boost :: program_options :: command_line_style versuchte, aber ich kann nicht Kombinationen finden, die würde: Ich mag Lese Argumente haben wollen geben Sie Verhalten gleich getopt_long.

fand ich heraus, dass für Argumente:

-server=www.example.com 

I Flaggen müssen:

command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent 

aber ich habe Probleme mit der Gründung Flaggen für:

-c config.txt 

ich, dass Flaggen gefunden:

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

gib mir fast was ich will. Fast weil:

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

so nach boost :: algorithm :: trim() wird es so sein, wie ich will.

Also meine Frage ist: ist es möglich, Argumente wie -c config.txt mit boost :: program_options zu handhaben, aber ohne boost :: Algorithmus :: trim()?

BEARBEITEN Ich bemerkte, dass Flags oben mit nicht registrierten Argumenten nicht funktionieren. Ich habe mich registriert Optionen:

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"); 

aber wenn ich nicht registrierten Optionen (ja, ich habe basic_command_line_parser :: allow_unregistered()):

-calibration=something 

Ich sehe:

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

Meine Frage nach Ausgabe ist: Wie behandelt man Argumente, die mit getopt_long mit boost :: program_options arbeiten?

Antwort

1

Wenn Sie boost::program_options verwenden, ist das Symbol '=' erforderlich, um die Parameter ordnungsgemäß zu analysieren. Wenn es fehlt, wird eine Ausnahme ausgelöst. Übrigens, die boost::property_tree ist auch eine sehr gute Wahl, um Konfigurationsdateien zu parsen. Code:

#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; 
} 

"Default" ist Abschnitt Name configure-Datei. Du kannst es versuchen.

+0

Ich denke, diese Antwort ist nicht verwandt. Die Frage zielt eindeutig auf das Parsen von Programmoptionen ab (posix getopt() etc.) – user23573