2011-01-16 10 views
12

boost programı seçenekleri için yapılandırma dosyası yazdırmak için bir yolu yoktur.Bir yapılandırma dosyasından parametreleri almak için boost :: program_options kullanıyorum

i elle bir dosya oluşturabilir ve program seçenekleri ayrıştırmak anlıyorum. ancak programın dosyayı otomatik olarak oluşturması için bir yol arıyorum. seçeneğin adını yazdırmak anlamına gelir ve değeridir. örneğin:

>./main init.cfg 
: o zaman ben metin düzenleyicisi kullanarak değerlerini değiştirmek o dosyaya gidin ve bu dosyayı kullanmak bu

[wave packet] 
width = 1 
position = 2.0 
[calculation parameters] 
levels = 15 

benziyor init.cfg üretecek seçeneğinin olmadığı

>./main 

operator<< olması variables_map sahip olacak bu yaklaşım için güzel bir yol. bu şekilde sadece dosyaya yazabilirim. değerleri değiştir. dosyayı oku. hepsi aynı formatta ve her satırı yazmanıza gerek yok.

i belgelerinde veya örneklerde böyle bir şey bulamadık. Bu

DÜZENLEME mümkün olup olmadığını bana bildirin lütfen: Sam Miller bölümlerde ini dosyasını ayrıştırmak için nasıl gösterdi. Ancak, hala boost :: program_options :: variables_map vm değerlerini almakta sorun yaşıyorum. i yerine it->second.value() aşağıdaki

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

çalıştı bir hata var. Ayrıca it->second'u denedim. Ben de bir hata var:

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 

i int'leri benim değerlerinin it->second.as<int>() ancak kullanamayacaklarınız eğer ben doğru değeri elde ve ben çift ulaştıktan sonra, program bu çöküyor:

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 

cevap

12

var farkında olduğum program_başlıkları kullanmanın bir yolu değil. Özellik ağacı kitaplığını write the ini file'a kullanabilirsiniz.

macmini:stackoverflow samm$ cat property.cc 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/ini_parser.hpp> 

#include <iostream> 

int 
main() 
{ 
    using boost::property_tree::ptree; 

    ptree root; 

    ptree wave_packet; 
    wave_packet.put("width", "1"); 
    wave_packet.put("position", "2.0"); 

    ptree calculation_parameters; 
    calculation_parameters.put("levels", "15"); 

    root.push_front(
      ptree::value_type("calculation parameters", calculation_parameters) 
      ); 
    root.push_front(
      ptree::value_type("wave packet", wave_packet) 
      ); 

    write_ini(std::cout, root); 

    return 0; 
} 

macmini:stackoverflow samm$ g++ property.cc 
macmini:stackoverflow samm$ ./a.out 
[wave packet] 
width=1 
position=2.0 
[calculation parameters] 
levels=15 
macmini:stackoverflow samm$ 
+0

Kısa bir örnek yazabilmenin herhangi bir yolu var mı? ya da bir yol haritası nasıl yapılır? –

+0

@kirill_igum Bir örnek ekledim. –

0

Bildiğim kadarıyla soruyu anlamadım olarak, bu verilen option_description dayalı yapılandırma dosyası yazma hakkındadır: Burada

kısa bir örnektir. İşte

yapılandırma dosyasına bir options_description nasıl yazılacağını mümkün, çözümdür. Her parametrenin bazı varsayılan değerlere sahip olduğu gerçeği ile ilgilidir. Eğer yapılandırma dosyasında bölümleri gerekiyorsa sorundur

algorithmsDesc_.add_options() 
    ("general.blur_Width", po::value<int>(&varWhereToStoreValue)->default_value(3), "Gaussian blur aperture width") 

:

void SaveDefaultConfig() 
{ 
    boost::filesystem::ofstream configFile(configFilePath_); 
    auto descOptions = algorithmsDesc_.options(); 
    boost::property_tree::ptree tree; 

    for (auto& option : descOptions) 
    { 
     std::string name = option->long_name(); 
     boost::any defaultValue; 
     option->semantic()->apply_default(defaultValue); 

     if (defaultValue.type() == typeid(std::string)) 
     { 
      std::string val = boost::any_cast<std::string>(defaultValue); 
      tree.put(name, val); 
     } 
     ///Add here additional else.. type() == typeid() if neccesary 
    } 

    //or write_ini 
    boost::property_tree::write_json(configFile, tree); 
} 

İşte algorithmsDesc sizin gibi seçenekleri açıklanmaktadır nerede yani artırmak :: program_options :: options_description olduğunu. options_description, altyazı aracılığıyla yapıcıdan geçirilecek yönteme sahip değildir. bunu elde etmek için kirli yolu baskı yaptığı çıkış akımından() onu kesmektir:

std::string getSectionName() 
{ 
    std::stringstream ss; 
    algorithmDesc_.print(ss) 

    std::string caption; 
    std::getline(ss,caption) 

    //cut last ':' 
    return caption.substr(0, caption.size() - 1) 
} 

onları bir arada birleştiren basittir.

İlgili konular