Object that Read & Write Themselves
Smart Object and Class: अक्सर हर Member Function को ये सुविधा देना कि किसी Class का हर Member किसी File के Data को Read व Write कर सके, एक उपयोगी प्रक्रिया होती है। ये एक सामान्य तरीका है और ये तरीका तब पर्याप्त उपयोगी होता है, जब कई Objects को एक समय पर Read या Write नहीं करना होता है।
हमारे अगले उदाहरण में हमने दो Member Functions diskOut() व diskIn() को person Class में Use किया है। ये Functions एक person Object को File में Write करने व File से Read करने की सुविधा प्रदान कर देते हैं।
हमने Program को सरल व समझने योग्य बनाए रखने के लिए ये माना है कि Class के सभी Objects एक ही File में Store हो रहे हैं, जिसका नाम PWESON.DAT है और हर Object File के अन्त में Append हो रहा है।
diskIn() Function में एक Argument हमें File से किसी भी Person के Data को read करने की सुविधा देता है। File के End से आगे के Data को Read ना किया जा सके, इसके लिए हमने एक Static Member Function diskCount() Create किया है, जो File में Stored Persons की संख्या Return करता है।
// rewobj.cpp // person objects do disk I/O #include <fstream.h> // for file streams class person // class of persons { protected: char name[40]; // person's name int age; // person's age public: void getData(void) // get person's data { cout << "\n Enter name: "; cin >> name; cout << " Enter age: "; cin >> age; } void showData(void) // display person's data { cout << "\n Name: " << name; cout << "\n Age: " << age; } void diskIn(int); // read from file void diskOut(); // write to file static int diskCount(); // return number of // persons in file }; void person::diskIn(int pn) // read person number pn { // from file ifstream infile; // make stream infile.open("PERSON.DAT", ios::binary); // open it infile.seekg( pn*sizeof(person) ); // move file ptr infile.read( (char*)this, sizeof(*this) ); // read one person } void person::diskOut() // write person to end of file { ofstream outfile; // make stream and open it outfile.open("PERSON.DAT", ios::app | ios::binary); outfile.write( (char*)this, sizeof(*this) ); // write to it } int person::diskCount() // return number of persons { // in file ifstream infile; infile.open("PERSON.DAT", ios::binary); infile.seekg(0, ios::end); // go to 0 bytes from end // calculate number of persons return infile.tellg() / sizeof(person); } void main(void) { person p; // make an empty person char ch; do // save persons to disk { cout << "\nEnter data for person:"; p.getData(); // get data p.diskOut(); // write to disk cout << "Do another (y/n)? "; cin >> ch; } while(ch=='y'); // until user enters 'n' int n = person::diskCount(); // how many persons in file? cout << "\nThere are " << n << " persons in file"; for(int j=0; j<n; j++) // for each one, { cout << "\nPerson #" << (j+1); p.diskIn(j); // read person from disk p.showData(); // display person } }
इस Program में कोई अजीब Coding नहीं है। इनमें से ज्यादातर Elements को हम पहले भी देख चुके हैं। फिर भी Disk Operations से सम्बंधित सभी Operations main() Function के लिए Invisible हैं। यानी इन्हें person Class में ही Perform कर दिया है।
हम ये बात पहले से ही नहीं जान सकते हैं कि हम जिस Data को Read या Write करने जा रहे हैं, वह Data कहां पर उपलब्ध है, क्योंकि हर Object Memory में अलग Location पर Stored रहता है। फिर भी this Pointer हमें हमेंशा ये बताता है कि जब हम एक Member Function में होते हैं तब हम कहां होते हैं। read() व write() Stream Functions में जिस Object के Data को Read या Write किया जाना होता है, उसका Address this Pointer में होता है और Object की Size sizeof(*this) Statement से प्राप्त हो जाती है। इस Program को Run करने पर इसका Output व User Interaction निम्नानुसार होता है:
// Output Enter data for person: Enter name: Acheson Enter age: 63 Enter another (y/n)? y Enter data for person: Enter name: Dulles Enter age: 72 Enter another (y/n)? n Person #1 Name: Stimson Age: 45 Person #2 Name: Hull Age: 58 Person #3 Name: Acheson Age: 63 Person #4 Name: Dulles Age: 72
यदि हम चाहते हैं कि User File का नाम स्वयं Specify कर सके, जिसे Class Use करता है, इसके बजाय कि हम File के नाम को Member Function में स्वयं लिखें] जैसाकि हमने इस Program में किया है, तो हमें एक Static Variable (जैसे कि fileName[]) Create करने की जरूरत पडती है और इसमें File का नाम Set करने के लिए एक Static Member Function की जरूरत पडती है। या फिर हम यदि हर Object को एक अलग File में Store करना चाहते हैं तो File का नाम Set करने के लिए एक Non-Static Member Function को Use कर सकते हैं।
Classes that Read & Write Themselves
मानलो कि हमारे पास Memory में कई Objects हैं और हम सभी को File में Write करना चाहते हैं। अब हर Object के लिए एक Member Function को Associate करके हर Object के लिए File को Open करनाए उसमें Object को Write करना व File को Close करना एक Efficient Approach नहीं हो सकता है। जैसाकि पिछले उदाहरण में हमने किया है। बल्कि Efficient Approach ये है कि File को केवल एक ही बार Open किया जाए और सभी Objects के Data को File में Write करके File को केवल एक ही बार Close किया जाए।
Static Functions
एक File में एक ही बार में बहुत सारे Object को Write करने का एक तरीका ये है कि हम Static Member Function का प्रयोग करें, क्योंकि Static Member Function पूरी Class के सभी Objects के लिए समान होता है ना कि हर Object के लिए अलग-अलग।
ये Function सभी Objects को एक ही बार में File में Write कर देता है। अब इस Function को ये पता कैसे चलेगा कि सभी Objects कहां पर हैं। इसके लिए हम उन Objects के Pointers का एक Array Use कर सकते हैं, जिन्हें File पर Static Data की तरह Store करना है।
एक Static Data Member इस बात की भी जानकारी या Track रख सकता है कि कितने Objects Create हुए हैं। Static Write Function File Open कर सकता है फिर एक Loop में ये Array में जा सकता है, हर Object को File में Write कर सकता है और अन्त में File को Close कर सकता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF