2011-11-14 30 views
12

Tôi có bản đồ C++ STL, là bản đồ của int và customType. CustomType là một cấu trúc, có chuỗi và danh sách chuỗi, Làm cách nào tôi có thể tuần tự hóa tệp này thành tệp.C++ Nối tiếp std :: ánh xạ thành một tệp

mẫu struct:

struct customType{ 
string; 
string; 
int; 
list<string>; 
} 
+2

Nhìn vào [Boost.Archive] (http://www.boost.org/doc/libs/release/libs/serialization/doc/tutorial.html). –

+2

Điều này đã được trả lời rất nhiều lần. Ví dụ ở đây: http://stackoverflow.com/questions/4422399/serialization-of-stl-class – astevanovic

Trả lời

6

Một giải pháp đơn giản là sản lượng mỗi thành viên trên một dòng riêng của nó, bao gồm tất cả các chuỗi trong danh sách. Mỗi bản ghi bắt đầu bằng khóa cho bản đồ và kết thúc bằng một ký tự đặc biệt hoặc chuỗi ký tự không thể có trong danh sách. Bằng cách này bạn có thể đọc một dòng tại một thời điểm và biết dòng đầu tiên là khóa bản đồ, dòng thứ hai là chuỗi đầu tiên trong cấu trúc, v.v. Khi bạn đạt đến chuỗi kết thúc bản ghi đặc biệt, bạn biết danh sách đã hoàn thành và đó là thời gian cho mục tiếp theo trong bản đồ. Đề án này làm cho các tệp được tạo có thể đọc được và có thể chỉnh sửa nếu bạn cần chỉnh sửa chúng bên ngoài chương trình.

1

Nếu bạn đang yêu cầu này, sau đó có lẽ bạn đã biết rằng bạn không thể serialize này bằng phương pháp:

file.write((const char *) &mapOfCustom, sizeof(mapOfCustom)); 

Vấn đề đã làm với đối tượng phức tạp (và trong C++, thậm chí một biến chuỗi là một đối tượng phức tạp), tức là các đối tượng không tự chứa. Trên thực tế, ngay cả serialization đơn giản có vấn đề, trong đó từ compatibilty nền tảng để compatibilty thậm chí trình biên dịch (paddings khác nhau, vv).

Một đường để đi là sử dụng một thư viện XML đơn giản như tinyXML:

http://www.grinninglizard.com/tinyxml/

Và viết lưu vào XML, và khôi phục lại từ thủ tục XML.

+0

Bạn chưa đọc/hiểu câu trả lời của tôi hoàn toàn. Vui lòng làm lại cẩn thận. – Baltasarq

1

C++ không có khả năng phản chiếu như Java và các công cụ khác, do đó không có cách 'tự động' làm điều đó. Bạn sẽ phải tự làm tất cả các công việc: mở tệp, xuất mỗi phần tử trong một vòng lặp và đóng tệp. Ngoài ra không có định dạng chuẩn cho tệp, bạn cần xác định một định dạng đáp ứng nhu cầu của mình. Tất nhiên, có những thư viện ở đó để giúp đỡ điều này, nhưng chúng không phải là một phần của ngôn ngữ. Hãy nhìn vào câu hỏi này:

Is it possible to automatically serialize a C++ object?

Ngoài ra hãy xem tại địa chỉ: http://s11n.net/

8

Nếu bạn không sợ BOOST, hãy thử BOOST Serialize: (mẫu mã, ở đây có thể có một số lỗi ...)

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/list.hpp> 

struct customType{ 
string string1; 
string string2; 
int i; 
list<string> list; 

// boost serialize 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> void serialize(Archive &ar, const unsigned int version) { 
     ar & string1; 
     ar & string2; 
     ar & i; 
     ar & list; 
    } 
}; 

template <typename ClassTo> 
int Save(const string fname, const ClassTo &c) 
{ 
    ofstream f(fname.c_str(), ios::binary); 
    if (f.fail()) return -1; 
    boost::archive::binary_oarchive oa(f); 
    oa << c; 
    return 0; 
} 

Cách sử dụng:

Save< map<int, customType> >("test.map", yourMap); 
0

Bạn có thể thử điều này: cxx-prettyprint

+0

Tôi thích liên kết, nhưng tiếc là điều đó không làm những gì OP muốn. Đối với người mới bắt đầu, 'customType' của cô ấy không thực hiện toán tử đầu ra đã định dạng (' >> '), và quan trọng hơn, việc tuần tự hóa thường không phải là đầu ra * được định dạng *, nhưng một số loại đầu ra nhị phân thô. –

+0

Có, tôi đã hiểu yêu cầu của cô ấy, nhưng việc tăng tuần tự hóa hoặc google protobuf có thể là quá mức cần thiết. Do đó đề nghị của tôi. – yasouser

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