#include <iostream>
#include <fstream>
#include <vector>


class C{
    private:
        int work_loc, floor_no;
    public:
        C(){}
        void printC(){
            std::cout << "work Location: " << work_loc << "  floor_no: " << floor_no;
        }
        C(int work_loc1, int floor_no1): work_loc(work_loc1), floor_no(floor_no1){}
};

class B{
    private:
        int empid_;
        std::string name_;
        C obj_c;
    public:
        B(int empid, std::string name, int work_loc, int floor_no): empid_(empid), name_(name){
            obj_c = C(work_loc, floor_no);
        }
        void printB(){
            std::cout << empid_ << " " << name_ << "\n ";
            obj_c.printC(); 

        }


};

class A{
private:
    std::vector<B> calls;
public:
    void addToCalls(B b){
        calls.push_back(b);
    }
    void printAll(){

        for(size_t i = 0; static_cast<int>(i) < 3; i++){
            std::cout << "i is " << i << "\n";
           calls[i].printB(); 
        }

    }
    int callSize(){
        return calls.size();
    }


};


int main(){
    A a, c;

    a.addToCalls(B(1,"a1", 1, 33));
    a.addToCalls(B(2,"b2", 3 ,44));
    a.addToCalls(B(3,"c2", 4, 55));
    a.addToCalls(B(4,"d3", 5, 22));
    a.addToCalls(B(5,"e4", 3, 88));
    a.printAll();
    std::cout << "end of a\n";  
    // FILE* f;
    // FILE* f1;
    // f = std::fopen("serial.txt", "w+");
    std::cout << "begin another a \n  ";
    std::fstream  f;
    std::fstream  f2;
    f.open("class_data.txt", std::ios::out|std::ios::binary);
    f.write((char*)&a, sizeof(a));

    // fwrite(a, sizeof(a), sizeof(a), f);
    // fwrite(&n, sizeof(int), 1, f);
    f.close();
    // rewind(f);
    // f.open("class_data.txt", std::ios::out | std::ios::binary);
    f2.open("class_data.txt", std::ios::in | std::ios::binary);
    f2.read((char*)&c, sizeof(c));
    std::cout << "the size of C is " << c.callSize() << "\n"; 
    c.printAll();
    // f.close();
    f2.close();


}

यहां मुझे डेटा ऑब्जेक्ट सी में कॉपी हो जाता है, लेकिन यह एक त्रुटि देता है। मान मुद्रित होने के बाद, कोड कोर डंप की गई त्रुटि देता है। ऑब्जेक्ट का मान फ़ाइल से कॉपी किया जाता है, जो उसी समय लिखा भी जाता है। क्या यह एक ही फाइल खोलने वाले 2 फाइल पॉइंटर्स की वजह से है? यहाँ बैकट्रेस है

i is 0
1 a1
 work Location: 1  floor_no: 33i is 1
2 b2
 work Location: 3  floor_no: 44i is 2
3 c2
 work Location: 4  floor_no: 55end of a
begin another a 
  the size of C is 5
i is 0
1 a1
 work Location: 1  floor_no: 33i is 1
2 b2
 work Location: 3  floor_no: 44i is 2
3 c2
*** Error in `./a.out': double free or corruption (!prev): 0x000000000135fda0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fae6020e7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fae6021737a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fae6021b53c]
./a.out[0x4028ea]
./a.out[0x40276a]
./a.out[0x402564]
./a.out[0x4021e3]
./a.out[0x401c80]
./a.out[0x401ad6]
./a.out[0x401635]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fae601b7830]
./a.out[0x4010c9]
======= Memory map: ========
00400000-00404000 r-xp 00000000 fc:02 17574813                           /home/local/Serialisation/a.out
00603000-00604000 r--p 00003000 fc:02 17574813                           /home/local/Serialisation/a.out
00604000-00605000 rw-p 00004000 fc:02 17574813                           /home/local/Serialisation/a.out
0134e000-01380000 rw-p 00000000 00:00 0                                  [heap]
7fae58000000-7fae58021000 rw-p 00000000 00:00 0 
7fae58021000-7fae5c000000 ---p 00000000 00:00 0 
7fae5fe8e000-7fae5ff96000 r-xp 00000000 fc:00 1573048                    /lib/x86_64-linux-gnu/libm-2.23.so
7fae5ff96000-7fae60195000 ---p 00108000 fc:00 1573048                    /lib/x86_64-linux-gnu/libm-2.23.so
7fae60195000-7fae60196000 r--p 00107000 fc:00 1573048                    /lib/x86_64-linux-gnu/libm-2.23.so
7fae60196000-7fae60197000 rw-p 00108000 fc:00 1573048                    /lib/x86_64-linux-gnu/libm-2.23.so
7fae60197000-7fae60357000 r-xp 00000000 fc:00 1573053                    /lib/x86_64-linux-gnu/libc-2.23.so
7fae60357000-7fae60557000 ---p 001c0000 fc:00 1573053                    /lib/x86_64-linux-gnu/libc-2.23.so
7fae60557000-7fae6055b000 r--p 001c0000 fc:00 1573053                    /lib/x86_64-linux-gnu/libc-2.23.so
7fae6055b000-7fae6055d000 rw-p 001c4000 fc:00 1573053                    /lib/x86_64-linux-gnu/libc-2.23.so
7fae6055d000-7fae60561000 rw-p 00000000 00:00 0 
7fae60561000-7fae60577000 r-xp 00000000 fc:00 1573314                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fae60577000-7fae60776000 ---p 00016000 fc:00 1573314                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fae60776000-7fae60777000 rw-p 00015000 fc:00 1573314                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fae60777000-7fae608e9000 r-xp 00000000 fc:00 4718942                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fae608e9000-7fae60ae9000 ---p 00172000 fc:00 4718942                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fae60ae9000-7fae60af3000 r--p 00172000 fc:00 4718942                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fae60af3000-7fae60af5000 rw-p 0017c000 fc:00 4718942                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7fae60af5000-7fae60af9000 rw-p 00000000 00:00 0 
7fae60af9000-7fae60b1f000 r-xp 00000000 fc:00 1573031                    /lib/x86_64-linux-gnu/ld-2.23.so
7fae60cf9000-7fae60cfe000 rw-p 00000000 00:00 0 
7fae60d1b000-7fae60d1e000 rw-p 00000000 00:00 0 
7fae60d1e000-7fae60d1f000 r--p 00025000 fc:00 1573031                    /lib/x86_64-linux-gnu/ld-2.23.so
7fae60d1f000-7fae60d20000 rw-p 00026000 fc:00 1573031                    /lib/x86_64-linux-gnu/ld-2.23.so
7fae60d20000-7fae60d21000 rw-p 00000000 00:00 0 
7ffd8c65f000-7ffd8c681000 rw-p 00000000 00:00 0                          [stack]
7ffd8c7a7000-7ffd8c7a9000 r--p 00000000 00:00 0                          [vvar]
7ffd8c7a9000-7ffd8c7ab000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
 work Location: 4  floor_no: 55Aborted (core dumped)
-2
citizenfour 31 अगस्त 2018, 14:51
क्या आप कृपया अपनी पोस्ट को पूरा आउटपुट जोड़ने के लिए संपादित कर सकते हैं? मुझे समझ में नहीं आता कि आपका कोड कहां क्रैश होता है।
 – 
PlikPlok
31 अगस्त 2018, 15:04
मेरा आउटपुट संपादित किया।
 – 
citizenfour
31 अगस्त 2018, 16:11
एक नजर @PlikPlok
 – 
citizenfour
31 अगस्त 2018, 16:22
मैं मैक्स के उत्तर के साथ बोर्ड पर था लेकिन त्रुटि संदेश *** Error in './a.out': double free or corruption (!prev): 0x000000000135fda0 *** और वह c.printAll() कम से कम सूची (फिर क्रैश) प्रिंट करने लगता है। मैं वैसे भी स्ट्रीम ऑपरेटरों का उपयोग करने का सुझाव दूंगा (<< >>), std::vector कार्यान्वयन में पॉइंटर्स हैं और हो सकता है कि दोनों वैक्टर के आंतरिक घटकों के विनाश से आपकी त्रुटि हो। स्ट्रीम ऑपरेटरों को दो अलग-अलग वैक्टर, एक दूसरे की प्रतियां बनाना चाहिए।
 – 
PlikPlok
31 अगस्त 2018, 16:58
उसने फ़ाइल से डेटा कैसे पढ़ा? चूंकि यहां क्रमांकन उचित नहीं था।
 – 
citizenfour
3 सितंबर 2018, 16:48

2 जवाब

आपकी कक्षा A में std::vector प्रकार का सदस्य है। आप फ़ाइल में केवल std::vector बाइनरी डेटा के रूप में नहीं लिख सकते हैं और इसे वापस पढ़ने में सक्षम होने की उम्मीद कर सकते हैं।

आपको std::vector के प्रत्येक सदस्य को लिखना और पढ़ना है।

वही std::string के लिए B के लिए जाता है, आप केवल std::string ऑब्जेक्ट नहीं लिख सकते हैं, आपको अंतर्निहित data लिखना होगा, और फिर डेटा को पढ़ते समय एक इसमें से नया std::string

आप अपनी कक्षाओं के लिए अपने स्वयं के << और >> ऑपरेटरों को परिभाषित कर सकते हैं, और उन्हें अपनी स्ट्रीम के साथ इस तरह उपयोग कर सकते हैं:

std::ostream& operator<< (std::ostream& stream, const A& a) 
{
    // Write data from a to stream
    return stream;
}

std::istream& operator>> (std::istream& stream, A& a)  
{  
    // Read data from stream to a
    return stream;
}

फिर f.write((char*)&a, sizeof(a)); के बजाय आप बस f << a; करते हैं

2
Max Vollmer 31 अगस्त 2018, 15:10
ऐसा लगता है कि यह इस विशेष मामले में काम करता है क्योंकि "वेक्टर का कच्चा बाइट डेटा" तुरंत फ़ाइल से पढ़ा जाता है, बिना कुछ भी लिखने के आदेश और पढ़ने के आदेश के बीच नष्ट हो जाता है। हालांकि आपकी प्रतिक्रिया पूरी तरह से मान्य है और स्ट्रीम ऑपरेटर जाने का रास्ता हैं।
 – 
PlikPlok
31 अगस्त 2018, 17:03
खैर, "काम करता है", जब तक कि दोनों वैक्टर दायरे से बाहर न हों, और एक ही स्मृति को मुक्त न करें। कई चीजों में से एक जो बाइनरी डेटा जैसे सीधे टाइप करते और पढ़ते समय गलत हो सकती है (और होगी)।
 – 
Max Vollmer
1 सितंबर 2018, 18:26

कक्षा A एक तुच्छ रूप से कॉपी करने योग्य प्रकार नहीं है, इसलिए यह यह दिखावा करने के लिए काम नहीं करता है कि यह केवल बाइट्स का एक क्रम है।

आपको अपनी वस्तुओं को बाइनरी फ़ाइलों में और से ठीक से परिवर्तित करने के लिए "क्रमबद्धता" देखने की आवश्यकता होगी।

1
aschepler 31 अगस्त 2018, 15:10