2011-07-05 3 views
1

У меня есть некоторые проблемы с чтением файла ini с использованием опций форматирования. Проблема является ключом, который содержит hashmarks (simplyfied пример):с использованием hashmark в значении параметров программы (ini-файл)

[раздел]
ключ = "ххх # YYY"

Получение ключа, возвращает "XXX", который является потому, что особые отметки, кажется, интерпретируется как начало комментария, и поэтому остальная часть строки пропускается. К сожалению, я не могу подставить «#» каким-либо другим символом, потому что это значение является регулярным выражением. Я не нашел способ процитировать хешмарк и предпочел бы не делать этого, потому что это изменит мое регулярное выражение и сделает его еще более нечитаемым.

Есть ли способ справиться с этой проблемой без перезаписи ini-file parser? Спасибо за любую помощь.

Мой код, чтобы получить ключ выглядит следующим образом:

std::string key; 
boost::program_options::options_description opDesc("test"); 
opDesc.add_options()("section.key", po::value<string>(&key)) 
std::ifstream ifs("file.ini"); 
boost::program_options::parse_config_file(ifs, opDesc); 

ответ

1

Возможно, настало время, чтобы начать использовать Boost Property Tree, как вы путь мимо их точки «Я разбора параметров программы» здесь, на самом деле.

http://www.boost.org/doc/libs/1_46_1/doc/html/property_tree.html

дерева недвижимости имеет парсер/форматтер для JSON, XML, INI (<-- you are here) и форматы INFO. Связанная страница указывает в нескольких строках точно, что за круглые поездки (в большинстве случаев roundtrip, за исключением информации о секретном типе JSON и иногда заканчивающейся пробелом).

Предположим, вам нужен формат INI (потому что он близок к тому, что вы используете) и настройке INFO (потому что он содержит больше строкового синтаксиса, в дополнение к иерархически вложенным разделам).


Из образцов:

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <boost/foreach.hpp> 
#include <string> 
#include <set> 
#include <exception> 
#include <iostream> 

struct debug_settings 
{ 
    std::string m_file;    // log filename 
    int m_level;      // debug level 
    std::set<std::string> m_modules; // modules where logging is enabled 
    void load(const std::string &filename); 
    void save(const std::string &filename); 
}; 

void debug_settings::load(const std::string &filename) 
{ 
    using boost::property_tree::ptree; 
    ptree pt; 
    read_xml(filename, pt); 
    m_file = pt.get<std::string>("debug.filename"); 
    m_level = pt.get("debug.level", 0); 
    BOOST_FOREACH(ptree::value_type &v, pt.get_child("debug.modules")) 
     m_modules.insert(v.second.data()); 
} 

void debug_settings::save(const std::string &filename) 
{ 
    using boost::property_tree::ptree; 
    ptree pt; 
    pt.put("debug.filename", m_file); 
    pt.put("debug.level", m_level); 
    BOOST_FOREACH(const std::string &name, m_modules) 
     pt.add("debug.modules.module", name); 
    write_xml(filename, pt); 
} 

int main() 
{ 
    try 
    { 
     debug_settings ds; 
     ds.load("debug_settings.xml"); 
     ds.save("debug_settings_out.xml"); 
     std::cout << "Success\n"; 
    } 
    catch (std::exception &e) 
    { 
     std::cout << "Error: " << e.what() << "\n"; 
    } 
    return 0; 
} 
+0

Звучит хорошо, спасибо много! – raines