using hashmark in program options value (ini file)

后端 未结 1 679
谎友^
谎友^ 2021-01-16 11:27

I have some trouble reading from an ini file using boost program options. The problem is a key which contains hashmarks (simplyfied example):

[section]
key=\"xxx

相关标签:
1条回答
  • 2021-01-16 11:54

    Perhaps it is time to start using Boost Property Tree as you are way past the 'I'm parsing program options' point here, really.

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

    Property tree has parsers/formatters for JSON, Xml, Ini (<-- you are here) and the INFO formats. The linked page specifies in a few lines exactly what round-trips (most things roundtrip, except for JSON sepcific type information and sometimes trailing whitespace).

    I suppose you'd like the INI format (because it's close to what you're using) and the INFO setting (because it has more string syntax, in addition to hierarchically nested sections).


    From the samples:

    #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 讨论(0)
提交回复
热议问题