2013-08-12 7 views
5
airport air(1,2,3); //an airport constructor 
ofstream myfile; 
myfile.open("rishab",ios::app||ios::binary); 
myfile.write((char*)air,sizeof(airport); 
myfile.close(); 

इस तरह के आदेशों को कई कार्यक्रमों की जानकारी प्राप्त करने के लिए मेरे कार्यक्रम में कई बार कहा जाता है। मूल रूप से बाइनरी फ़ाइल हवाई अड्डे से भरा है। मुझे बाद में इन सभी हवाई अड्डों को एक सरणी में पढ़ने की जरूरत है। मैं फ़ाइल को कैसे पढ़ूं ताकि मुझे हवाई अड्डे की सरणी मिल सके।सी ++ एक ही कक्षा

क्षमा करें यदि यह प्रश्न बहुत बुनियादी है। मैं पॉइंटर्स और सबसे कम पथ ग्राफ के बारे में हाईस्कूल सीखने में हूं।

+0

यह 'हवाई अड्डे' वर्ग की परिभाषा पर निर्भर करता है। – molbdnilo

+0

कक्षा हवाई अड्डे { int planeCapacity; int स्वीकार करें Pllanes से; // और कुछ अन्य इन्ट्स सार्वजनिक: कन्स्ट्रक्टर .. एक्सेसर विधियों }; यह बात करता है। –

+0

मुझे नहीं पता कि लोगों को क्या लगता है कि आपकी इनपुट फ़ाइल में ऑब्जेक्ट्स के वैध बाइनरी डंप हैं। आपने यह नहीं कहा। अधिकांश उत्तर इस आईएमओ को जोखिम भरा धारणा बनाते हैं। इसके अलावा वे दृष्टिकोण प्रस्तुत करते हैं जो कुछ हद तक वैध थे और 'सी' में उपयोग किए जाते थे लेकिन अप्रचलित है। यदि आप 'सी ++' में हैं और ऑब्जेक्ट्स से निपटना है तो यह जल्द से जल्द बहुत जल्द खत्म हो जाएगा। 'हवाई अड्डे 'में सबसे छोटा बदलाव संगतता को तोड़ देगा। क्या आप बता सकते हैं कि इनपुट फ़ाइल कैसे बनाई गई है? आप वास्तव में भंडारण को जानने के साथ पढ़ने की विधि तैयार नहीं कर सकते हैं। वे दृढ़ता से युग्मित हैं। 'हवाई अड्डे' की परिभाषा भी उपयोगी होगी। – luk32

उत्तर

4

आप जो करने की कोशिश कर रहे हैं वह क्रमबद्ध है। वस्तुओं को क्रमबद्ध करने का यह तरीका स्थिर नहीं है, और अत्यधिक हवाई अड्डे पर निर्भर करता है। स्पष्ट क्रमिकरण का उपयोग करना बेहतर है।

Here क्या क्रमबद्धता का विवरण है और यह इस तरह क्यों बनाया जाता है। सांत्वना उत्पादन के साथ

struct airport { 
std::string name; //you can name your airports here 
int planeCapacity; 
int acceptPlanesFrom; 
MSGPACK_DEFINE(name,planeCapacity,acceptPlanesFrom); 
}; 

...

// define your airports 
std::vector<airport> airports; 
airport a={"BLA",1,2}; 
airport b={"BLB",3,4}; 
airports.push_back(a); 
airports.push_back(b); 

// create a platform-independent byte sequence from your data 
msgpack::sbuffer sbuf; 
msgpack::pack(sbuf, airports) ; 
std::string data=sbuf.data();//you can write that into a file 

msgpack::unpacked msg; 
// get your data safely back 
msgpack::unpack(&msg, sbuf.data(), sbuf.size()); 
msgpack::object obj = msg.get(); 

std::cout<<obj<<std::endl; 

// now convert the bytes back to your objects 
std::vector<airport> read_airports; 
obj.convert(&read_airports); 
std::cout<<read_airports.size()<<std::endl; 

:

MessagePack में एक ठेठ क्रमबद्धता-अक्रमांकन परिदृश्य इस प्रकार दिखाई देगा

[["BLA", 1, 2], ["BLB", 3, 4]] 
2 
5

अच्छा, अगर आप सुनिश्चित हैं कि आपकी फ़ाइल मान्य है, तो आप आसानी से read() का उपयोग कर सकते हैं जब तक आप ईओएफ तक नहीं पहुंच जाते। प्रत्येक read() - sizeof(airport) - आपको एक वैध airport ऑब्जेक्ट देगा।

ध्यान दें कि बाइनरी "मान" और ऑब्जेक्ट को संग्रहीत करने से ऑब्जेक्ट को लोड करते समय अमान्य ऑब्जेक्ट का परिणाम होगा यदि इसमें पॉइंटर्स या संदर्भ शामिल हैं।

संपादित करें: myfile.write((char*)&air,sizeof(airport);air की सामग्री को ऑब्जेक्ट करेगा। ऐसा करके, आप वास्तव में ऑब्जेक्ट लिख रहे हैं, पॉइंटर नहीं।

+0

हाय आपके लिए बहुत बहुत धन्यवाद जवाब। अब मैं समझता हूं कि मैं फाइल पर पॉइंटर्स लिख रहा हूं और ऑब्जेक्ट को पढ़ने की कोशिश कर रहा हूं। क्या आप मुझे बता सकते हैं कि फाइल पर ऑब्जेक्ट कैसे लिखना है, न कि पॉइंटर। –

+0

आपको जो चाहिए वह डेटा की संरचित क्रमबद्धता है, सी ++ मेमोरी संरचनाओं के नहीं। –

+0

@DmitryLedentsov हाँ बिल्कुल, सिवाय इसके कि जब आपकी कक्षा में केवल मूल प्रकार होते हैं (या ऑब्जेक्ट्स जो स्वयं मूल प्रकार के होते हैं)। – Xaqq

0
ofstream myfile; 

std::vector<airport> vec; 
myfile.open("rishab",ios::app||ios::binary); 
while(myfile.write(reinterpret_cast<char*>(&air),sizeof(airport)) != 0) 
    vec.push_back(air); 

myfile.close(); 

अब प्रसंस्करण

+0

'(char *) और air' होना चाहिए। – Xaqq

+0

@Xaqq अपडेट किया गया, धन्यवाद – P0W

+0

यह काम करेगा क्योंकि मैं फ़ाइल में पॉइंटर भेज रहा हूं, न कि ऑब्जेक्ट? क्षमा करें बस मिश्रित हो रही है। और अब मुझे वेक्टर के माध्यम से फिर से जाना होगा? –

0

के लिए vec का उपयोग आप इसे इस तरह कार्यक्रम कर सकते हैं।

struct AirPort 
{ 
    int a; 
    int b; 
    int c; 
}; 
int main() 
{ 
    std::vector<AirPort> airportList; 
    FILE* fp = fopen(filename,"rb"); 
    if(NULL != fp) 
    { 
     while(!feof(fp)) 
     { 
      AirPort ap; 
      if (fread(&ap,sizeof(ap),1,fp)==1) 
      { 
       airportList.push_back(ap); 
      } 
     } 
    } 
    fclose(fp); 
    return 0; 
} 
+0

हाय धन्यवाद। हालांकि, मैं थोड़ी उलझन में हूं क्योंकि मैंने बहुत सारे वैक्टर और सूचियां की हैं। हालांकि, हवाईअड्डा एक वर्ग है और अब मेरी समझ से, मैं एक सूचक मूल्य लिख रहा हूं और उस वस्तु को पढ़ने की कोशिश कर रहा हूं जो स्पष्ट रूप से महत्वहीन होगा। क्या आप मेरी समस्या के साथ मेरी मदद कर सकते हैं? –

+0

आपका मतलब है कि यदि वेक्टर या सूचियों का उपयोग नहीं करते हैं तो प्रोग्राम कैसे करें? मुझे स्पष्ट समझ में नहीं आ रहा है.मेरी अंग्रेजी बहुत अच्छी नहीं है। क्या आप वही बोल सकते हैं जो आप चाहते हैं। यह बेहतर है कि आपका सी ++ कोड यहां रखें। – Keen

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