2011-11-14 12 views
12

मेरे पास एक सी ++ एसटीएल मानचित्र है, जो int और customType का नक्शा है। कस्टम टाइप एक संरचना है, जिसमें स्ट्रिंग और स्ट्रिंग की एक सूची है, मैं इसे फ़ाइल में कैसे क्रमबद्ध कर सकता हूं।सी ++ एक std :: मानचित्र को एक फ़ाइल में serializing

नमूना struct:

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

देखो (http://www.boost.org/doc/libs/release/libs/serialization/doc/tutorial.html)। –

+2

यह पहले से ही कई बार जवाब दिया गया था। उदाहरण के लिए यहां: http://stackoverflow.com/questions/4422399/serialization-of-stl-class – astevanovic

उत्तर

6

एक सरल समाधान उत्पादन के लिए अपने दम पर एक लाइन, सूची में सभी तार सहित पर प्रत्येक सदस्य है। प्रत्येक रिकॉर्ड मानचित्र की कुंजी से शुरू होता है, और एक विशेष चरित्र या चरित्र अनुक्रम के साथ समाप्त होता है जो सूची में नहीं हो सकता है। इस तरह आप एक समय में एक पंक्ति पढ़ सकते हैं, और पता है कि पहली पंक्ति नक्शा कुंजी है, दूसरी पंक्ति संरचना में पहली स्ट्रिंग है और इसी तरह, और जब आप अपने विशेष रिकॉर्ड-एंडिंग अनुक्रम तक पहुंचते हैं तो आप जानते हैं कि सूची पूरी की जाती है और यह मानचित्र में अगले आइटम के लिए समय है। यह योजना फ़ाइलों को पठनीय, और संपादन योग्य बनाता है यदि आपको प्रोग्राम के बाहर उन्हें संपादित करने की आवश्यकता है।

1

आप इस पूछ रहे हैं, तो शायद आप पहले से ही पता है कि तुम के माध्यम से इस को क्रमानुसार नहीं कर सकते हैं:

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

समस्या जटिल वस्तुओं के साथ क्या करना है (और सी ++ में, यहां तक ​​कि एक स्ट्रिंग चर एक है जटिल वस्तु), यानी, वे वस्तुएं जो स्वयं निहित नहीं हैं। असल में, यहां तक ​​कि सरल क्रमिकरण में समस्याएं होती हैं, जो प्लेटफार्म संगतता से लेकर कंपाइलर compatibilty (विभिन्न पैडिंग, आदि) तक भी होती हैं।

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

और एक्सएमएल को बचाने के बारे में, और XML प्रक्रियाओं से बहाल:

एक तरह से जाने के लिए इस तरह के tinyXML के रूप में एक सरल XML पुस्तकालय का उपयोग करें।

+0

आपने मेरे उत्तर को पूरी तरह से पढ़/समझ नहीं लिया है। कृपया इसे और अधिक सावधानी से करें। – Baltasarq

1

सी ++ में जावा और अन्य जैसी प्रतिबिंब क्षमताएं नहीं हैं, इसलिए ऐसा करने का कोई 'स्वचालित' तरीका नहीं है। आपको अपने आप को सभी काम करना होगा: फ़ाइल खोलें, प्रत्येक तत्व को लूप में आउटपुट करें, और फ़ाइल बंद करें। इसके अलावा फ़ाइल के लिए कोई मानक प्रारूप नहीं है, आपको अपनी आवश्यकताओं को पूरा करने वाले व्यक्ति को परिभाषित करने की आवश्यकता होगी। बेशक, इसमें मदद करने के लिए पुस्तकालय हैं, लेकिन वे भाषा का हिस्सा नहीं हैं। (टेम्पलेट कोड, यहाँ कुछ त्रुटियों हो सकता है: इस सवाल पर एक नज़र डालें:

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

इसके अलावा पर एक नज़र डालें: http://s11n.net/

8

आप बूस्ट का डर नहीं कर रहे हैं, बूस्ट को क्रमानुसार कोशिश ...)

#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; 
} 

उपयोग:

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

आप इस कोशिश कर सकते हैं: [Boost.Archive] में cxx-prettyprint

+0

मुझे लिंक पसंद है, लेकिन दुर्भाग्यवश ऐसा नहीं करता जो ओपी चाहता है। शुरुआत करने वालों के लिए, उनका 'कस्टम टाइप' प्रारूपित आउटपुट ऑपरेटर ('>>') लागू नहीं करता है, और अधिक महत्वपूर्ण बात यह है कि क्रमशः सीरियलाइजेशन * स्वरूपित * आउटपुट नहीं है, लेकिन कुछ प्रकार के कच्चे, बाइनरी आउटपुट। –

+0

हां, मैंने उसकी आवश्यकता को समझ लिया था, लेकिन सीरियलाइजेशन या Google प्रोटोबफ को बढ़ावा देना एक ओवरकिल हो सकता है। इसलिए मेरा सुझाव। – yasouser

संबंधित मुद्दे