Sto utilizzando boost :: program_options per ottenere parametri da un file di configurazione.c'è un modo per stampare il file di configurazione per le opzioni del programma di potenziamento
Capisco che posso creare un file a mano e le opzioni del programma lo analizzeremo. ma sto cercando un modo per il programma per generare automaticamente il file. significa stampare il nome dell'opzione e il suo valore. per esempio:
>./main
senza opzione genererebbe init.cfg che assomiglia a questo
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
quindi vorrei andare in quel file modificare i valori utilizzando editor di testo e utilizzare questo file:
>./main init.cfg
un buon modo per avvicinarsi a questo sarebbe avere variables_map per avere operator<<
. in questo modo posso solo scriverlo in un file. cambia i valori. leggi il file. tutto nello stesso formato e nessuna necessità di scrivere ogni riga.
Non ho trovato nulla di simile nella documentazione o negli esempi. per favore fatemi sapere se questo è possibile
MODIFICA: Sam Miller ha mostrato come analizzare il file ini nelle sezioni. Tuttavia, ho ancora un problema nel recuperare i valori da boost :: program_options :: variables_map vm. ho provato la seguente
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";
}
invece di it->second.value()
, ha ottenuto un errore. ho anche provato it->second
. Ho anche avuto un errore:
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
ottengo il valore correttamente se io uso it->second.as<int>()
ma non tutti i miei valori sono interi e una volta raggiungo doppio, il programma si blocca con questo:
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
c'è un modo per scrivere un breve esempio? o dare una road map come si fa? –
@kirill_igum Ho aggiunto un esempio. –