Я использую boost :: program_options для получения параметров из файла конфигурации.
Я понимаю, что могу создать файл вручную, и параметры программы проанализируют его. но я ищу способ для программы для автоматического создания файла. что означает вывод названия опции и ее значения. например:
>./main
без опции создаст файл init.cfg, который выглядит следующим образом
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
тогда я бы пошел в этот файл, изменил значения с помощью текстового редактора и использовал бы этот файл:
>./main init.cfg
хороший способ приблизиться к этому - иметь переменную_карту, имеющую operator<<
. таким образом, я могу просто записать это в файл. изменить значения. прочитайте файл. все в одном формате и не нужно писать каждую строку.
Я не смог найти ничего подобного в документации или примерах. пожалуйста, дайте мне знать, если это возможно
РЕДАКТИРОВАТЬ: Сэм Миллер показал, как анализировать INI-файл в разделах. Тем не менее у меня все еще есть проблема получения значений из boost :: program_options :: variable_map vm.
я попробовал следующее
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";
}
вместо it->second.value()
, произошла ошибка. я тоже попробовал it->second
. я также получил ошибку:
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
Я получаю значение правильно, если я использую it->second.as<int>()
, но не все мои значения являются целочисленными значениями, и как только я достигаю значения double, программа вылетает с этим:
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