Biblioteka plików właściwości dla C (lub c++)

Tytuł jest dość oczywisty: czy ktoś zna (dobrą) bibliotekę czytników plików dla C lub, jeśli nie, C++?

[Edit: aby być konkretnym, chcę bibliotekę, która obsługuje .format pliku właściwości używany w Javie: http://en.wikipedia.org/wiki/.properties]

Author: Steve Jessop, 2009-05-17

4 answers

STLSoft ' S 1.10 alpha zawiera klasę platformstl::properties_file. Można go użyć do odczytu z pliku:

using platformstl::properties_file;

properties_file  properties("stuff.properties");

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

Lub z pamięci:

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"];

Wygląda na to, że najnowsza Wersja 1.10 ma kilka kompleksowych testów jednostkowych i że zaktualizowali klasę tak, aby obsługiwała wszystkie reguły i przykłady podane w dokumentacji Javy .

Jedynym pozornym rub jest to, że value_type jest instancją stlsoft::basic_string_view (opisane w to Dr Dobb ' s Artykuł ), który jest nieco podobny do std::string, ale tak naprawdę nie posiada swojej pamięci. Prawdopodobnie robią to, aby uniknąć niepotrzebnych przydziałów, prawdopodobnie ze względu na wydajność, co jest czymś, co projekt STLSoft jest drogi. Ale to znaczy, że nie możesz po prostu napisać

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

Możesz jednak zrobić to:

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

I to:

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

Nie jestem pewien, czy Zgadzam się z tą decyzją projektową, ponieważ jak prawdopodobne jest, że odczyt właściwości - z pliku lub z pamięci-jest będzie potrzebował absolutnego ostatniego cyklu. Myślę, że powinni zmienić go na domyślne użycie std::string, a następnie użyć "widoku ciągów", jeśli jest to jawnie wymagane.

Poza tym, Klasa properties_file wygląda na to, że robi sztuczkę.

 5
Author: dcw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-23 20:46:41

Libconfuse (biblioteka C) jest również przydatna; istnieje od zawsze i jest elastyczna.

To daleko, daleko poza Javą.util.Właściwości. Jednak nie musi obsługiwać narożnych przypadków formatu pliku java properties (który wydaje się być twoim wymaganiem).

Zobacz przykłady:

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

Brak biblioteki wrapperów C++, O której jednak wiem.

 4
Author: michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 03:55:42

Domyślam się ,że przez 'properties file' masz na myśli plik konfiguracyjny.

W tym przypadku Google daje (pierwsze 4 trafienia dla C config file library):

 2
Author: qrdl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-17 07:50:48

Poco ma również implementację do odczytu plików właściwości http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html

Prosty przykład skopiowany stąd: http://pocoproject.org/slides/180-Configuration.pdf

Zawartość pliku właściwości:

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

Przykład kodu

#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");
 1
Author: Mhh Lecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 06:57:19