2012-06-08 38 views
6

Đây là một điều rất đơn giản, vì vậy tôi muốn giữ nó đơn giản như nó âm thanh. Tất cả những gì tôi muốn là tải một loạt các cặp khóa-giá trị từ một tệp và điền chúng vào một bản đồ. Tôi không thực sự quan tâm cách văn bản được cấu trúc, miễn là nó dễ đọc.tải std :: bản đồ từ tập tin văn bản

gì tôi có bây giờ là:

  • xml với XSD tạo mã (overkill)
  • Nghị định thư đệm (còn quá mức cần thiết)
  • INI tập tin kiểu chữ

Tôi thích cú pháp của tệp INI, nhưng tôi không muốn viết một trình phân tích cú pháp cho điều đó. Nghe có vẻ như tôi sẽ làm rất nhiều người đã làm trước tôi. Không có một số loại thư viện để đọc các tập tin cấu trúc đơn giản như thế này?

+2

định dạng csv thậm chí còn đơn giản hơn, mỗi dòng là một cặp giá trị như: khóa; giá trị. Vì vậy, khóa/giá trị của bạn được phân tách bằng dấu chấm phẩy. Tôi nghi ngờ bạn sẽ tìm thấy bất kỳ thư viện cho rằng (nhưng một số có thể tồn tại) kể từ khi phân tích nó rất đơn giản. – marcinj

+1

có thể trùng lặp với [CSV parser in C++] (http://stackoverflow.com/questions/1120140/csv-parser-in-c) – gbjbaanb

+0

@gbjbaanb, bạn nói đúng, csv cũng nên làm việc cho tôi. Tuy nhiên, tôi vẫn muốn thấy trình phân tích cú pháp cho định dạng INI chuẩn. –

Trả lời

7

Vì bạn dường như muốn điều đơn giản nhất có thể, tôi sẽ đề xuất điều gì đó vô cùng đơn giản có thể hoặc có thể không hoạt động dựa trên nội dung bản đồ của bạn. Nếu giá trị dữ liệu bản đồ của bạn là các chuỗi bao gồm dấu cách, thì điều này sẽ không hoạt động. Nếu chúng là các chuỗi không có dấu cách hoặc số, bạn sẽ được đặt.

Đây không phải là mã được thử nghiệm, nhưng nó gần gũi và đơn giản, do đó bạn nên ổn ngay cả khi nó không hoàn toàn biên dịch. Chỉ cần thay đổi KeyType và ValueType thành int, string, float hoặc bất kỳ thứ gì bạn đang thực sự sử dụng trong tệp.

Thiết lập tập tin như:

key value 
key2 value2 
key3 value3 
key4 value4 

đọc như:

KeyType key; 
ValueType value; 

std::map<KeyType, ValueType> myMap; 
while (infile >> key >> value) 
    myMap[key] = value; 
+2

Điều đó rất đơn giản! Sẽ làm việc hoàn hảo cho những gì tôi đang làm. Tuy nhiên, không phải định dạng INI, nhưng phải hoạt động –

+4

-1, điều kiện vòng lặp phải là 'while (infile >> key >> value)' và đối với thân vòng lặp 'myMap [key] = value;' là đơn giản hơn –

+1

, nhưng chỉ để nhấn mạnh và giải thích những gì Jonathan nói: đây không đơn giản là vấn đề về phong cách - điều kiện 'eof()' không được thiết lập cho đến sau một nỗ lực thất bại để đọc qua kết thúc (thí nghiệm suy nghĩ: ngay cả khi không ở cuối cùng) ký tự trong 'infile', làm thế nào nó có thể biết tại' while() 'cho dù nó có đủ ký tự cho cả khóa và giá trị?). Riêng biệt, và FWIW, điều này có thể làm việc cho các khóa 'std :: string' và các giá trị với dấu cách chỉ đơn giản là thay đổi thành' while (getline (infile, key) && getline (infile, value)) '. –

0

Nếu bạn đang ở trong thế giới MS bạn có thể sử dụng

GetPrivateProfileSectionNames 
GetPrivateProfileString 
WritePrivateProfileString 

để đọc từ tập tin ini hoặc regestry . Nếu bạn muốn viết Unicode, hãy chắc chắn rằng một tệp mới được tạo sẽ nhận được BOM của UTF16.

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