2009-05-17 38 views
11

Tiêu đề khá tự giải thích: không ai biết thư viện trình đọc tệp thuộc tính (tốt) cho C hoặc, nếu không, C++?Thư viện tệp thuộc tính cho C (hoặc C++)

[Edit: Để cụ thể, tôi muốn có một thư viện mà xử lý các định dạng tập tin được sử dụng trong .properties Java: http://en.wikipedia.org/wiki/.properties]

+6

Không tự e xplanatory thực sự - một "tập tin thuộc tính" là gì? –

+3

Vâng, tôi đoán rằng định dạng tệp thuộc tính - một yếu tố chủ yếu của Java - không được biết đến rộng rãi bên ngoài thế giới Java, điều này phần nào giải thích tại sao tôi không thể tìm thấy nó. Xem http://en.wikipedia.org/wiki/.properties (Tôi không có đủ danh tiếng để thêm câu hỏi này vào câu hỏi.) – JamieH

+1

Tôi đã thêm nó cho bạn - Tôi hy vọng rằng tôi đã diễn giải chính xác. –

Trả lời

5

STLSoft 's 1.10 alpha chứa một platformstl::properties_file lớp học. Nó có thể được sử dụng để đọc từ một tập tin:

using platformstl::properties_file; 

properties_file properties("stuff.properties"); 

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

hoặc từ bộ nhớ:

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

Hình như phiên bản mới nhất 1.10 có một bó toàn diện đơn vị xét nghiệm, và rằng họ đã nâng cấp để xử lý tất cả các quy tắc và ví dụ được đưa ra trong Java documentation.

Các chỉ chà rõ ràng là value_type là một thể hiện của stlsoft::basic_string_view (được mô tả trong this Dr Dobb's article), mà là hơi tương tự như std::string, nhưng không thực sự sở hữu bộ nhớ của nó. Có lẽ họ làm điều này để tránh phân bổ không cần thiết, có lẽ vì lý do hiệu suất, đó là một cái gì đó thiết kế STLSoft giữ thân yêu. Nhưng nó có nghĩa là bạn không thể chỉ viết

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

Bạn có thể, tuy nhiên, làm được điều này:

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

và điều này:

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

Tôi không chắc chắn Tôi đồng ý với quyết định thiết kế này, vì khả năng đọc các thuộc tính - từ tệp hoặc từ bộ nhớ là như thế nào - sẽ cần chu trình cuối cùng tuyệt đối. Tôi nghĩ rằng họ nên thay đổi nó để sử dụng std::string theo mặc định, và sau đó sử dụng "chuỗi xem" nếu yêu cầu một cách rõ ràng.

Khác hơn thế, lớp học properties_file có vẻ như nó thực hiện thủ thuật.

+0

Cảm ơn, đó là khá nhiều những gì tôi đang tìm kiếm. Tôi sẽ kiểm tra. Liên kết của bạn [4] bị hỏng, btw – JamieH

4

libconfuse (thư viện C) cũng hữu ích; nó được xung quanh mãi mãi & là linh hoạt.

Nó đi bằng cách nào, cách xa hơn java.util.Properties. Mặc dù, nó sẽ không nhất thiết phải xử lý các trường hợp góc của định dạng tệp thuộc tính java (có vẻ như là yêu cầu của bạn).

Xem các ví dụ:

  • đơn giản: www.nongnu.org/confuse/simple.conf
  • điên: www.nongnu.org/confuse/test.conf

Không Thư viện trình bao bọc C++, mà tôi biết.

0

Poco cũng có một thực hiện cho Reading PropertyFiles http://pocoproject.org/docs/Poco.Util.PropertyFileConfiguration.html

Một ví dụ đơn giản sao chép từ đây: http://pocoproject.org/slides/180-Configuration.pdf

nội dung tập tin tài sản:

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

Mã dụ

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