Properties file library for C (or C++)

前端 未结 4 1205
难免孤独
难免孤独 2020-12-04 20:28

The title is pretty self-explanatory: does anyone know of a (good) properties file reader library for C or, if not, C++?

Edit: To be specific, I want a library which

相关标签:
4条回答
  • 2020-12-04 20:52

    I guess by 'properties file' you mean config file.

    In this case Google gives (first 4 hits for C config file library):

    • http://www.hyperrealm.com/libconfig/
    • http://rudeserver.com/config/
    • http://freshmeat.net/projects/cfl/
    • http://liblcfg.carnivore.it/
    0 讨论(0)
  • 2020-12-04 20:56

    STLSoft's 1.10 alpha contains a platformstl::properties_file class. It can be used to read from a file:

    using platformstl::properties_file;
    
    properties_file  properties("stuff.properties");
    
    properties_file::value_type  value = properties["name"];
    

    or from memory:

    properties_file  properties(
        "name0=value1\n name1 value1 \n name\\ 2 : value\\ 2  ",
        properties_file::contents);
    
    properties_file::value_type  value0 = properties["name0"];
    
    properties_file::value_type  value1 = properties["name1"];
    
    properties_file::value_type  value2 = properties["name 2"];
    

    Looks like the latest 1.10 release has a bunch of comprehensive unit-tests, and that they've upgraded the class to handle all the rules and examples given in the Java documentation.

    The only apparent rub is that the value_type is an instance of stlsoft::basic_string_view (described in this Dr Dobb's article), which is somewhat similar to std::string, but doesn't actually own its memory. Presumably they do this to avoid unneccessary allocations, presumably for performance reasons, which is something the STLSoft design holds dear. But it means that you can't just write

    std::string  value0 = properties["name0"];
    

    You can, however, do this:

    std::string  value0 = properties["name0"].c_str();
    

    and this:

    std::cout << properties["name0"];
    

    I'm not sure I agree with this design decision, since how likely is it that reading properties - from file or from memory - is going to need the absolute last cycle. I think they should change it to use std::string by default, and then use the "string view" if explicitly required.

    Other than that, the properties_file class looks like it does the trick.

    0 讨论(0)
  • 2020-12-04 21:04

    libconfuse (C library) is useful, too; it's been around forever & is flexible.

    • ( www.nongnu.org/confuse/ ) http://www.nongnu.org/confuse/tutorial-html/index.html

    It goes way, way beyond java.util.Properties. Though, it won't necessarily handle the corner cases of the java properties file format (which seems to be your requirement).

    See the examples:

    • simple: www.nongnu.org/confuse/simple.conf
    • crazy: www.nongnu.org/confuse/test.conf

    No C++ wrapper library, that I'm aware of, though.

    0 讨论(0)
  • 2020-12-04 21:05

    Poco also has an Implementation for Reading PropertyFiles http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html

    A Simple example copied from here: http://pocoproject.org/slides/180-Configuration.pdf

    Property file content:

    # a comment
    ! another comment
    key1 = value1
    key2: 123
    key3.longValue = this is a very \
    long value
    path = c:\\test.dat
    

    Code example

    #include <Poco/Util/PropertyFileConfiguration.h>
    using Poco::AutoPtr;
    using Poco::Util::PropertyFileConfiguration;
    AutoPtr<PropertyFileConfiguration> pConf;
    pConf = new PropertyFileConfiguration("test.properties");
    std::string key1 = pConf->getString("key1");
    int value = pConf->getInt("key2");
    std::string longVal = pConf->getString("key3.longValue");
    
    0 讨论(0)
提交回复
热议问题