2009-05-17 7 views
11

Tytuł jest całkiem zrozumiały: czy ktoś wie o (dobrej) bibliotece plików właściwości dla C, a jeśli nie, C++?Biblioteka plików właściwości dla C (lub C++)

[Edit: Mówiąc konkretnie, chcę biblioteki, która obsługuje format plików .properties używany w Java: http://en.wikipedia.org/wiki/.properties]

+6

Not własny e xplanatory właściwie - co to jest "plik właściwości"? –

+3

Cóż, domyślam się, że format pliku właściwości - podstawowy element Javy - nie jest tak znany poza światem Java, co częściowo wyjaśnia, dlaczego nie mogę go znaleźć. Zobacz http://en.wikipedia.org/wiki/.properties (Nie mam wystarczającej reputacji, aby dodać to do pytania.) – JamieH

+1

Dodałem to dla ciebie - mam nadzieję, że poprawnie sparafrazowałem. –

Odpowiedz

5

STLSoft „s 1.10 alpha zawiera platformstl::properties_file klasa. Może być używany 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 najnowszym wydaniu 1.10 ma kilka wszechstronnych testów jednostkowych, i że już zmodernizowane klasa do obsługi wszystkich reguł i przykładów podanych w Java documentation.

jedynie widoczne na ścieranie jest to, że value_type jest wystąpienie stlsoft::basic_string_view (opisany w this Dr Dobb's article), która jest nieco podobna do std::string, ale faktycznie nie właścicielem pamięci. Prawdopodobnie robią to, aby uniknąć niepotrzebnych alokacji, prawdopodobnie ze względu na wydajność, co jest bardzo bliskie dla projektu STLSoft. Ale to oznacza, że ​​nie można po prostu napisać

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

Można jednak to zrobić:

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

a to:

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

Nie jestem pewien, zgadzam się z ta decyzja projektowa, ponieważ prawdopodobne jest, że czytanie właściwości - z pliku lub z pamięci - będzie wymagało bezwzględnego ostatniego cyklu. Myślę, że powinni go zmienić domyślnie na std::string, a następnie użyć "widoku łańcucha", jeśli jest to wyraźnie wymagane.

Poza tym klasa properties_file wygląda na to, że działa.

+0

Dzięki, tego właśnie szukałem. Sprawdzę to. Twój link [4] jest zepsuty, btw – JamieH

4

przydatne jest także libconfuse (biblioteka C); istnieje już od zawsze & jest elastyczny.

To wykracza daleko poza, java.util.Properties. Chociaż niekoniecznie zajmie się przypadkami narożnymi formatu pliku właściwości java (co wydaje się być twoim wymaganiem).

Zobacz przykłady:

  • prosty: www.nongnu.org/confuse/simple.conf
  • szalony: www.nongnu.org/confuse/test.conf

nr Cała biblioteka otoki C++, o której wiem.

0

Poco ma również implementację do czytania PropertyFiles http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html

prosty przykład skopiowane 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ładowy kod

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