2009-09-13 36 views
9

Tôi là một newbie tìm kiếm một cách nhanh chóng và dễ dàng để phân tích một tập tin văn bản trong C hoặc C++ (wxWidgets)tập tin cấu hình Parse trong C/C++

Các tập tin sẽ giống như thế này (Một loại chính với "đối tượng phụ") sẽ xuất hiện trong hộp danh sách

[CategoryA] 

[SubCat] 

    Str1 = Test 

    Str2 = Description 

[SubCat] [End] 

[SubCat] 

    Str1 = Othertest 
... 

[CategoryA] [End] 

Mọi đề xuất?

+0

Nếu bạn viết định dạng của riêng mình, bạn có thể phải viết trình phân tích cú pháp của riêng bạn. Xem http://stackoverflow.com/questions/1669/learning-to-write-a-compiler – dmckee

Trả lời

14

Có vẻ như bạn muốn phân tích cú pháp tệp gần giống với tệp ini.

Có ít nhất một vài thư viện phân tích cú pháp INI ở ngoài: Ví dụ: minIni, iniParser, libini.

0

Làm cách nào để thử tạo một tệp XML đơn giản? Có rất nhiều thư viện có thể giúp bạn đọc nó, và tiền thưởng thêm là rất nhiều các chương trình/ngôn ngữ khác có thể đọc nó.

+0

Tôi đã tìm thấy chi phí không nhất thiết phải phân tích cú pháp nhưng ràng buộc các tệp xml với dữ liệu không đáng để nỗ lực cho các tệp cấu hình đơn giản . Nếu bạn có cái gì đó tạo ra các ràng buộc thì đó là một vấn đề khác. –

1

Dường như đơn giản hơn khi triển khai trình phân tích cú pháp của riêng bạn hơn là cố gắng điều chỉnh bộ phân tích hiện tại mà bạn không quen thuộc.

Cấu trúc của bạn có vẻ - từ ví dụ của bạn - để dựa trên dòng. Điều này làm cho việc phân tích cú pháp dễ dàng.

Thường có ý nghĩa khi tải tệp của bạn vào một cây và sau đó đi bộ xung quanh khi cần thiết.

1

Chỉ trên Windows, GetPrivateProfileSection thực hiện việc này. Nó không được chấp nhận vì lợi ích của registry nhưng nó vẫn ở đây và nó vẫn hoạt động.

13

Sẽ khá dễ dàng để viết trình phân tích cú pháp của riêng bạn nếu bạn sử dụng luồng. Bạn có thể đọc một tập tin sử dụng một std::ifstream:

std::ifstream ifs("filename.ext"); 
if(!ifs.good()) throw my_exceptions("cannot open file"); 
read_file(ifs); 

Kể từ khi có vẻ như dòng theo định hướng, sau đó bạn sẽ lần đầu tiên đọc dòng này, và sau đó xử lý sau đây:

void read_file(std::istream& is) 
{ 
    for(;;) { 
    std::string line; 
    std::getline(is, line); 
    if(!is) break; 
    std::istringstream iss(line); 
    // read from iss 
    } 
    if(!is.eof()) throw my_exceptions("error reading file"); 
} 

Đối với phân tích thực tế, bạn có thể 1) lần đầu tiên nhìn vào nhân vật đầu tiên. Nếu đó là số [, hãy bật nó từ luồng và sử dụng std::getline(is,identifier,']') để đọc bất kỳ nội dung nào nằm trong '[' và ']'. Nếu đó không phải là [, hãy sử dụng std::getline(is, key, '=') để đọc phía bên trái của cặp khóa-giá trị và sau đó std::getline(is, value) để đọc phía bên phải.

Lưu ý: Đầu vào luồng, thật không may, thường không chính xác nhanh như chớp. (Điều này không phải như vậy, nhưng trong thực tế điều này thường là.) Tuy nhiên, nó thực sự dễ làm và nó khá dễ dàng để làm điều đó đúng, một khi bạn biết rất ít mô hình để làm việc với các đặc thù của nó (như if(strm.good()) không giống như if(strm) và không phải là đối diện của if(strm.bad()) và một số thứ khác bạn sẽ phải quen với việc sử dụng). Đối với một cái gì đó như là hiệu suất quan trọng (har har!) Như đọc một tập tin ini từ đĩa, nó phải đủ nhanh trong 999,999 trong số 1.000.000 trường hợp.

+2

Ba năm sau, nhưng một câu trả lời rất có nhiều thông tin. Tôi khá mới để tạo luồng và bạn cung cấp tất cả thông tin tôi cần để tạo một trình phân tích cú pháp cơ bản mà không cần bất kỳ thư viện bổ sung nào (Chủ yếu là tôi thích toàn bộ đối số getline để lấy chuỗi giữa các ký tự cụ thể). Tôi ước tôi có thể cung cấp nhiều hơn một +1. –

9

Bạn có thể muốn thử Boost.Program_Options. Tuy nhiên nó có định dạng hơi khác nhau. Gần hơn với các tệp INI. Các danh mục phụ được thực hiện như sau:

[CategoryA] 
Option = Data 

[CategoryB.Subcategory1] 
Option = Data 

[CategoryB.Subcategory2] 
Option = Data 

Ngoài ra, nó còn có một số tính năng khác để IMO thực sự rất hữu ích.

0

Nếu bạn đang sử dụng wxWidgets, tôi sẽ xem xét wxFileConfig. Tôi không sử dụng wxWidgets, nhưng lớp học dường như hỗ trợ các danh mục với các danh mục con.

3

Hãy thử Trình cấu hình. Thư viện C++ dễ sử dụng và linh hoạt cho việc phân tích tệp cấu hình (từ INI đơn giản đến các tệp phức tạp với việc tùy ý làm tổ và kiểm tra ngữ nghĩa). Chỉ có tiêu đề và đa nền tảng. Sử dụng thư viện Boost C++.

Xem: http://opensource.dshevchenko.biz/configurator

Các vấn đề liên quan