2009-02-27 12 views
7

किसी फ़ाइल फ़ाइल में सी ++ में संरचना की सामग्री लिखने के बारे में कैसे जाना होगा? मैं क्या करना चाहता हूं, कहें कि मेरे पास डेटा नामक एओन, एटीओ, और इसी तरह से ए नामक एक संरचना है, और मैं उन्हें टेक्स्ट फ़ाइल में लाइन से लिखना चाहता हूं, जैसेडंपिंग सी ++ संरचनाओं को एक पाठ फ़ाइल

संरचना एक
A.one = मूल्य
A.two = मूल्य ...

संरचना बी
B.one = मूल्य
B.two = मूल्य

मूल रूप से मैं बनाना चाहते एक डंप .. क्या ऐसा करने का कोई आसान तरीका है? इसके लिए सबसे अच्छा I/O विधि क्या है? CFile? iostream? धन्यवाद .. क्या कक्षा के सदस्य डेटा के सभी मूल्यों को डंप करने का कोई आसान तरीका है?


संपादित करें: बकवास, धन्यवाद लोग ..

+0

संबंधित: * [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serialize-in-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](httpoverstow.com/questions/523872/how-do-you-serialize-an-object-in-c) – dmckee

उत्तर

8

C++ कोई प्रतिबिंब, आप (simplicty के लिए iostream का उपयोग करके) मैन्युअल रूप से यह करने के लिए, उदाहरण के लिए है, तो:

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

सी ++ आत्मविश्लेषी नहीं है। यही है, यह इसकी संरचनाओं की सामग्री के बारे में कुछ भी नहीं जानता है। ऐसा करने के लिए आपको किसी प्रकार की मैन्युअल एनोटेशन या प्रतिबिंब प्रणाली का उपयोग करना होगा।

बेशक, यदि आप संरचनाओं के बारे में हार्डकोडिंग जानकारी के साथ ठीक हैं, तो आप जानकारी को किसी भी I/O विधि से डंप कर सकते हैं।

उदाहरण के लिए:

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

आप देख सकते हैं इस कठिन है क्योंकि यह संरचना के अंतरंग ज्ञान की आवश्यकता है, और अगर संरचना बदल गया है स्वचालित रूप से अपडेट नहीं किया जाएगा। लेकिन एक "प्रतिबिंब" करने के लिए एक प्रतिबिंब प्रणाली का उपरांत एक नुकसान हो सकता है, खासकर यदि आप सीख रहे हैं।

+0

शायद सी ++ स्टैंडअर्ट I/O कक्षाओं का उपयोग यहां सुरक्षित होगा? यदि सदस्य 1 और सदस्य 2 के प्रकार बदल दिए जाएंगे तो आपका कोड गलत तरीके से काम करेगा। – okutane

+0

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

0

यह सी ++ से सी के लिए और अधिक लागू होता है, लेकिन ध्यान में भालू है कि यदि आप लिख सकता हूँ फ़ाइल (या एक नेटवर्क बफर) फ़ाइल करने के लिए सीधे एक संरचना तो परिणाम मशीन और कंपाइलर निर्भर होगा। इंटीग्रेटर्स मेजबान बाइट ऑर्डर और स्ट्रक्चर के लिए कंपाइलर पैडिंग बाइट्स में भी लिखे जाएंगे। विभिन्न endianness या विभिन्न संकलक निर्देशों के साथ एक मशीन पर बफर पढ़ने का प्रयास

ऐसा कुछ ऐसा होगा (वाक्यविन्यास पर क्षमा कर रहा है): लिखें (एफ, & ए, आकार (ए));

3

मुझे बूस्ट क्रमबद्ध पुस्तकालयों के साथ सफलता मिली है। इसका उपयोग करना आसान है और सी ++ डेटा संरचनाओं के क्रमिकरण और deserialization के लिए एक प्राकृतिक पसंद है।, http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/index.html

0

यदि यह सिर्फ एक struct, एक सादे पुराने सी-संगत डेटा प्रकार है, साथ कोई आभासी तरीकों और कोई संकेत:

यहाँ ट्यूटोरियल के लिए एक लिंक है तो एक अल्पकालिक kludge के रूप में तुम सिर्फ इस्तेमाल कर सकते हैं:

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

हालांकि, यह एक ही मंच पर क्रॉस-प्लेटफ़ॉर्म, या यहां तक ​​कि क्रॉस-कंपाइलर संशोधन होने की अपेक्षा न करें।

I think I've discussed this before...

+0

एफडी मतलब लिखने में क्या मतलब है (एफडी, ....)? क्या फाइल हैंडल है? इसमें कुछ पॉइंटर्स हैं .. =/ – krebstar

+0

fd == फ़ाइल डिस्क्रिप्टर, जैसा कि खुले() से प्राप्त किया गया है। यदि आप FILE * (fopen से) का उपयोग कर रहे हैं, तो आप fwrite() का उपयोग कर सकते हैं। –

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