C(或C ++)的属性文件库

14

这个标题已经很明确了:有没有人知道一个(好的)用于C或C++的属性文件阅读库?

编辑:更具体地说,我想要一个可以处理Java中使用的.properties文件格式的库:http://en.wikipedia.org/wiki/.properties


6
“properties file”是什么并不是显而易见的,它是一个存储键值对的文本文件。 - anon
4
Java语言中常用的属性文件格式在Java世界之外可能并不是很普及,这也解释了为什么我找不到该格式的资料。您可以参考http://en.wikipedia.org/wiki/.properties(我没有足够的声望将其添加到问题中)。 - JamieH
1
我已经为您添加了它 - 我希望我已经正确地改述了它。 - Steve Jessop
1
任何人都可以编辑自己的问题。 - anon
4个回答

8

STLSoft1.10 alpha 版本包含了一个名为 platformstl::properties_file 的类。它可以用来从文件中读取内容:

using platformstl::properties_file;

properties_file  properties("stuff.properties");

properties_file::value_type  value = properties["name"];

或者从内存中:
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"];

看起来最新的1.10版本有一堆全面的单元测试,并且他们升级了该类以处理在Java文档中给出的所有规则和示例。
唯一明显的问题是value_typestlsoft::basic_string_view的实例(在这篇Dr Dobb's文章中有描述),它与std::string有些相似,但实际上并不拥有其内存。据推测,他们这样做是为了避免不必要的分配,可能是出于性能原因,这是STLSoft设计所珍视的。但这意味着你不能只写
std::string  value0 = properties["name0"];

你可以这样做:
std::string  value0 = properties["name0"].c_str();

并且这个:

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

我不确定我同意这个设计决定,因为从文件或内存中读取属性需要绝对的最后一个周期有多大可能性。我认为他们应该默认使用std::string,如果需要可以显式地使用“字符串视图”。

除此之外,properties_file类看起来已经做到了它的功能。


谢谢,这正是我想要的。我会去查看一下。顺便说一句,你的链接[4]已经失效了。 - JamieH

5

libconfuse(C库)也很有用;它已经存在了很长时间并且灵活。

它远远超出了java.util.Properties的范围。但是,它不一定处理Java属性文件格式的边角案例(似乎这是您的要求)。

请参阅以下示例:

  • 简单:www.nongnu.org/confuse/simple.conf
  • 疯狂:www.nongnu.org/confuse/test.conf

我不知道有没有C++包装库。


3
Poco还拥有读取PropertyFiles的实现方式。 http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html 这里提供了一个简单的示例,摘自:http://pocoproject.org/slides/180-Configuration.pdf Property文件内容:
# a comment
! another comment
key1 = value1
key2: 123
key3.longValue = this is a very \
long value
path = c:\\test.dat

代码示例

#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");

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接