Używam boost :: program_options do pobierania parametrów z pliku konfiguracyjnego.czy istnieje sposób drukowania pliku konfiguracyjnego dla opcji programu doładowania?
Rozumiem, że mogę utworzyć plik ręcznie i opcje programu będą analizowane. ale szukam sposobu, aby program automatycznie wygenerował plik. oznacza wydrukowanie nazwy opcji i jej wartości. na przykład:
>./main
bez opcji będzie generować init.cfg który wygląda tak
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
Potem pójdzie do tego pliku zmienić wartości za pomocą edytora tekstu, a do tego pliku:
>./main init.cfg
dobrym sposobem podejścia byłoby mieć variable_map, aby mieć operator<<
. w ten sposób mogę po prostu zapisać go do pliku. zmień wartości. przeczytaj plik. wszystkie w tym samym formacie i nie trzeba pisać każdej linii.
Nie mogłem znaleźć czegoś takiego w dokumentacji lub przykładach. proszę dać mi znać, jeśli to możliwe
EDYCJA: Sam Miller pokazał, jak przeanalizować plik ini w sekcjach. Jednak nadal mam problem z pobieraniem wartości z boost :: program_options :: variables_map vm. próbowałem następujące
for(po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it)
{
if(it->first!="help"&&it->first!="config")
cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
}
zamiast it->second.value()
, masz błąd. Próbowałem także it->second
. mam również błąd:
icpc -lboost_serialization -lboost_program_options -c programOptions.cc
programOptions.cc(60): error: no operator "<<" matches these operands
operand types are: std::basic_ostream<char, std::char_traits<char>> << boost::any
cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
^
compilation aborted for programOptions.cc (code 2)
make: *** [programOptions.o] Error 2
uzyskać wartość poprawnie w przypadku korzystania it->second.as<int>()
ale nie wszystkie moje wartości są ints i raz sięgam dwukrotnie, program zawiesza się z tym:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >'
what(): boost::bad_any_cast: failed conversion using boost::any_cast
Czy jest jakiś sposób na napisanie krótkiego przykładu? lub dać mapę drogową, jak to zrobić? –
@kirill_igum Dodałem przykład. –