2010-01-25 17 views
6

Chương trình của tôi đang đọc một tệp văn bản chứa nhiều dòng văn bản khác nhau cho tệp cài đặt. Một số dòng có thể rất lớn. Hiện tại kích thước bộ đệm là 4096 ký tự. Có thể một số dòng có thể vượt quá điều này, cho dù thông qua sự độc hại hoặc do các yếu tố khác nhau hoạt động trong chương trình.Có thư viện C phổ biến để đọc các cặp tên/giá trị từ một tệp không?

Các thói quen hiện tại khá tẻ nhạt để viết và bây giờ tôi muốn mở rộng nội dung có thể có của tệp, điều này đòi hỏi nhiều mã lặp đi lặp lại tẻ nhạt này. (Điều này là dành cho tệp loại cài đặt, bao gồm các cặp name value và tiêu đề phần không thường xuyên. Một số giá trị số cần được đọc dưới dạng chuỗi do nhiều độ chính xác).

Điều chính tôi muốn là đọc một dòng chiều dài tùy ý mà không bị tràn bộ đệm. Tôi vừa mới phát hiện ra đường dây có thể làm điều này cho tôi, nhưng, ở đó có thiên đường vì một thư viện sẽ chỉ làm toàn bộ sự tẻ nhạt này cho tôi?

chỉnh sửa:

Tôi không muốn bị buộc phải đặt một dấu = giữa tên và giá trị, một không gian trống nên đủ như tách.

Bằng cách phổ biến rộng rãi, tôi có nghĩa là thư viện sẽ có sẵn trong các gói tiêu chuẩn của bản phân phối Linux phổ biến.

Tôi biết về libconfig nhưng có vẻ như quá mức cần thiết cho các yêu cầu của tôi.

Trả lời

1

Đề xuất của tôi là, TỰ LÀM, vì nó khá dễ dàng.

  • đọc mỗi dòng
  • chars đếm cho đến khi tách của bạn và sau khi tách bạn
  • phân bổ bộ đệm
  • và đọc các cặp giá trị tên với sscanf

    như:

    sscanf(line, "%[^:]: %[^\n]", key, value);

Bạn sẽ an toàn vì bạn đã tính ký tự trước sccanf.

+0

trong trường hợp này tôi cũng đề nghị viết nó, nó có vẻ tầm thường đủ. Vấn đề duy nhất là làm thế nào bạn sẽ lưu trữ bảng của bạn, nếu điều này là tinh khiết C sau đó không có std :: bản đồ cho bạn, nhưng tôi đoán bạn có cấu trúc dữ liệu của riêng bạn đã? –

+0

Cảm ơn bạn đã trả lời sscanf% [..], nhưng sau khi thử nghiệm, bạn đang thiếu dấu mũ: '"% [^:]:% [^ \ n] "', chúc mừng, tôi sẽ đi tuyến đường này . –

+0

Đã sửa. Xin lỗi vì thiếu sót. – piotr

4

Nhìn vào libini, nghe có vẻ đúng. Nó là khá cũ và không chính xác trải qua phát triển điên cuồng, nhưng nếu nó đã làm việc cho vấn đề của bạn, đó sẽ là tốt.

Thư viện cập nhật hơn, với nhiều lợi ích khác, là glib, có key-value-parser API.

+0

Tôi đã quyết định chống lại tùy chọn glib như, một lần nữa, nó quá mức cần thiết cho các yêu cầu của tôi. Câu trả lời được chọn là chính xác, mặc dù không trực tiếp giải quyết câu hỏi thư viện, đã giúp tôi tiếp tục và không phá vỡ bất kỳ đặc tả tệp hiện có nào đang được sử dụng trong các tệp dữ liệu hiện có. –

+1

@ James: Tốt thôi, tôi đoán ... Mặc dù tôi có khuynh hướng nghĩ rằng đối với bất kỳ chương trình C không tầm thường nào, glib là một sự phụ thuộc lành mạnh vì nó bổ sung rất nhiều thứ thường cần trong các chương trình như vậy. – unwind

1

Tôi đã đóng góp updated fork of libini tại CCAN. Nó cũng chứa một thực thi từ điển rất hữu ích cũng như một số thuật toán băm đơn giản. Rusty đặt nó trong repo, vì vậy tôi đoán tôi đã làm một công việc hợp lý tốt để đưa nó đến nay và sửa chữa vài lỗi nhỏ. Bạn có thể tìm thấy phiên bản mới nhất của thư viện nếu bạn poke through this tree, nó chứa hỗ trợ token cơ bản cũng như hỗ trợ giao dịch cơ bản (hữu ích cho việc đọc lại tệp cấu hình và hoàn nguyên nếu có lỗi phân tích cú pháp). Nó cũng chứa một bộ kiểm tra đơn vị được cập nhật nhiều hơn.

Tôi không chủ động duy trì ngã ba nữa, vì tác giả gốc của libini đã hoạt động trở lại, tuy nhiên mô-đun được duy trì trong CCAN.

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