Estoy usando boost :: program_options para obtener los parámetros de un archivo de configuración.hay una manera de imprimir el archivo de configuración para aumentar las opciones del programa
entiendo que puedo crear un archivo a mano y las opciones del programa lo analizarán. pero estoy buscando una manera para que el programa genere el archivo automáticamente. es decir, imprimir el nombre de la opción y su valor. por ejemplo:
>./main
sin opción generaría init.cfg que tiene este aspecto
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
entonces me gustaría ir a ese archivo cambiar los valores utilizando el editor de texto y utilizar este archivo:
>./main init.cfg
una buena manera de abordar esto sería tener variables_map para tener operator<<
. de esta manera solo puedo escribirlo en el archivo. cambiar los valores. lee el archivo todo en el mismo formato y sin necesidad de escribir cada línea.
no pude encontrar nada de eso en la documentación o ejemplos. por favor, hágamelo saber si esto es posible
EDITAR: Sam Miller mostró cómo analizar el archivo ini en secciones. Sin embargo, todavía tengo problemas para obtener los valores de boost :: program_options :: variables_map vm. He intentado lo siguiente
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";
}
en lugar de it->second.value()
, tiene un error. También probé it->second
. También me dio un error:
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
consigo el valor correctamente si uso it->second.as<int>()
pero no todos mis valores son enteros y una vez que llego doble, el programa se bloquea con esto:
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
¿hay alguna manera de que pueda escribir un pequeño ejemplo? o dar una hoja de ruta cómo hacerlo? –
@kirill_igum He añadido un ejemplo. –