Библиотека файлов свойств для C (или С++)

Заголовок довольно понятен: кто-нибудь знает (хорошую) библиотеку для чтения файлов свойств для C или, если нет, С++?

[Edit: Чтобы быть конкретным, мне нужна библиотека, которая обрабатывает формат файла .properties, используемый в Java: http://en.wikipedia.org/wiki/.properties]

Ответ 1

STLSoft 1.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_type является экземпляром stlsoft::basic_string_view (описано в эта статья д-ра Добба), которая несколько похожа на std::string, но на самом деле не имеет собственной памяти. Предположительно, они делают это, чтобы избежать ненужных ассигнований, предположительно по соображениям производительности, и это то, что дорого стоит конструкции STLSoft. Но это означает, что вы не можете просто написать

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

Вы можете, однако, сделать это:

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

и это:

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

Я не уверен, что согласен с этим дизайнерским решением, поскольку, насколько вероятно, что свойства чтения - из файла или из памяти - нуждаются в абсолютном последнем цикле. Я думаю, что они должны поменять его на использование std::string по умолчанию, а затем использовать "строковое представление", если это явно требуется.

Кроме того, класс properties_file выглядит как трюк.

Ответ 2

libconfuse (библиотека C) тоже полезен; это было навсегда и является гибким.

Это идет, путь за пределами java.util.Properties. Хотя он не обязательно будет обрабатывать угловые случаи формата файла java-свойств (что, по-видимому, является вашим требованием).

См. примеры:

  • simple: www.nongnu.org/confuse/simple.conf
  • сумасшедший: www.nongnu.org/confuse/test.conf

Нет библиотеки обложек С++, о которой я знаю.

Ответ 4

Poco также имеет реализацию для чтения PropertyFiles http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html

Простой пример, скопированный здесь: http://pocoproject.org/slides/180-Configuration.pdf

Содержимое файла свойств:

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