fstream Class: अभी तक हमने जिन File Objects को Create किया है, वे या तो Input के लिए Use किए गए हैं या फिर Output के लिए। निम्न Program में हम एक ऐसा File Object Create कर रहे हैं, जिसे Input व Output दोनों के लिए Use किया जा सकता है।
यदि हम ऐसा Object चाहते हैं जिसे दोनों कामों के लिए Use किया जा सके, तो हमें fstream Class का Object Create करना चाहिए। fstream Class को iostream Class से Derive किया गया है और iostream Class को istream व ostream Class से Derive किया गया है। इसलिए ये Input व Output दोनों को Handle कर सकते हैं।
fstream Class : The open() Function
पिछले उदाहरण में हमने निम्नानुसार एक ही Statement द्वारा एक File Object को Create करके Initialize कर लिया था%
ofstream outfile(“TEXT.TXT”);
इस Program में हम एक अलग तरीका Use कर रहे हैं। हमने एक Statement द्वारा File को Create किया है और इसे open() Function का प्रयोग करके दूसरे Statement में Open किया है, जो कि fstream Class का एक Member Function है। ये Approach उस स्थिति में काफी उपयोगी होता है, जब Open Fail हो सकता है। हम एक Stream Object को एक बार Create करके उसे बिना दुबारा Create किए हुए कई बार Open करने की कोशिश कर सकते हैं।
The Mode Bits
हमने ios::binary Mode को पहले भी Use कर लिया है। open() Function में हमने कई नए Mode Bits को Use किया है। ये Mode Bits ios Class में Define किए गए हैं, जो किसी Stream को Open करने के विभिन्न तरीके तय करते हैं। निम्न Table में File Opening के विभिन्न Modes को दर्शाया गया है:
Mode Bit | Result |
in | Open for reading (default for ifstream). |
out | Open for writing (default for ofstream). |
ate | Start reading or writing at end-of-file(AT End). |
app | Start writing at end-of-file(APPend). |
trunc | Truncate file to zero length if it exists (TRUNCate). |
nocreate | Error when opening if file does not already exist. |
noreplace | Error when opening for output if file already exists, unless ate or app is set. |
binary | Open file in binary (not text) mode. |
पिछले Program में हमने app Mode का प्रयोग किया है, क्योंकि हम ये चाहते हैं कि File में पहले से जो Data उपलब्ध है, वह नए Data से Replace ना हो। इस Mode का प्रयोग करने पर हम जो भी Data Input करते हैं, वह File के पहले के Data के अन्त में Append हो जाता है।
हमने in व out का प्रयोग किया है। क्योंकि हम Input व Output दोनों कामों को File पर Perform करना चाहते हैं और साथ ही हमने Binary का प्रयोग किया है, क्योंकि हम Binary Objects को File में Write कर रहे हैं। कई Flags को एक साथ Apply करने के लिए हमने विभिन्न Flags के बीच OR Operator का प्रयोग किया है।
हमने एक समय में एक Person Object को File में write() Function का प्रयोग करके Write किया है। लिखना बन्द करने के बाद हम पूरी File को Read करना चाहते हैं। इससे पहले कि हम पूरी File को Read कर सकें] हमें फिर से File की शुरूआत पर पहुंचना जरूरी होता है। ऐसा करने के लिए यानी File की Current Position को Reset करने के लिए हमने seekg() Function का प्रयोग किया है। इस Function के बारे में हम इसी अध्याय में आगे पढेंगे।
ये Function तय कर देता है कि हम File की Reading File की बिल्कुल शुरूआत से करेंगे। फिर एक while Loop में हमने person Object को File से Read किया है और साथ ही उसे Screen पर Display भी कर दिया है। File से Objects के Data की Reading तब तक होती रहती है, जब तक कि EOF प्राप्त नहीं हो जाता और eof() Function से हमें ios::eofbit की स्थिति प्राप्त हो जाती है।
Error Handling in File I/O
हमने अभी तक File से सम्बंधित जितने भी उदाहरण देखे हैं, उनमें हमने किसी भी उदाहरण में Error को Handle करने से सम्बंधित कोई बात नहीं की है। हमने यही माना है कि जो File हम Reading के लिए Open कर रहे हैं, वह पहले से ही Disk पर मौजूद है और जो File हम Writing के लिए Open कर रहे हैं, वह File नई Create हो सकती है या उसमें नया Data Append किया जा सकता है। हमने ये भी माना है कि File की Reading व Writing के समय कुछ भी Failure नहीं हो रहा है।
जबकि एक Real Program में इस प्रकार की परिस्थितियों को Handle करना महत्वपूर्ण होता है और यदि इन में से कुछ भी गडबड होती है तो उसके सम्बंध में जरूरी Actions लेना जरूरी होता है। ऐसा भी हो सकता है कि हम जिस File को Open करना चाहते हैं, वह Disk पर उपलब्ध ना हो। या नई File बनाने के लिए Disk में Space ना हो। या हम जिस File को Open करना चाहते हैं, वह पहले से ही Open हो। इस प्रकार की स्थितियों से बचने के लिए हमें File I/O के लिए Error-Handling करना जरूरी हो जाता है।
Reaction to Errors
अगले Program में बताया गया है कि हम किस प्रकार से इन Errors को अधिकतम Efficiency के साथ Handle कर सकते हैं। सभी Disk Operations को Perform करने के बाद उन्हें Check किया जाता है। यदि कोई Error Generate होती है, तो एक Message Print होता है और Program Terminate हो जाता है। हमने इस तकनीक का प्रयोग पिछले Programs में किया है, जहां Object स्वयं अपनी Return Value को Check करके Error Status का पता लगा लेता है।
ये Program एक Output Stream Object Open करता है, उसमें Integers के एक Array को write() Function द्वारा Write करता है और Object को Close करता है। फिर ये Program एक Input Stream को Open करता है और Integers के इस Array को read() Function को Call करके Read करता है। Program निम्नानुसार है:
#include <fstream.h> // for file streams #include <process.h> // for exit() const int MAX = 1000; int buff[MAX]; void main() { int j; for(j=0; j<MAX; j++) // fill buffer with data buff[j] = j; ofstream os; // create output stream // open it os.open("a:edata.dat", ios::trunc | ios::binary); if(!os) { cerr << "\nCould not open output file"; exit(1); } cout << "\nWriting..."; // write buffer to it os.write( (char*)buff, MAX*sizeof(int) ); if(!os) { cerr << "\nCould not write to file"; exit(1); } os.close(); // must close it for(j=0; j<MAX; j++) // clear buffer buff[j] = 0; ifstream is; // create input stream is.open("a:edata.dat", ios::binary); if(!is) { cerr << "\nCould not open input file"; exit(1); } cout << "\nReading..."; // read file is.read( (char*)buff, MAX*sizeof(int) ); if(!is) { cerr << "\nCould not read from file"; exit(1); } for(j=0; j<MAX; j++) // check data if( buff[j] != j ) { cerr << "\nData is incorrect"; exit(1); } cout << "\nData is correct"; }
Analyzing Errors
इस Program में हमने Entire Stream Object की Return Value को Check करके ये पता किया है कि I/O Operation में कोई Error Generate हुआ है या नहीं।
if( !is )
// Error Occurred
इस Program में यदि कोई Error Generate नहीं होती है, तो Program एक Pointer Value Return करता है, लेकिन यदि कोई Error Generate हो तो Program Return Value के रूप में Zero Return करता है। Errors को खोजने के लिए Return Values को Check करना सबसे सरल तरीका है। हालांकि इस बात से कोई फर्क नहीं पडता है कि Error किस तरह की है, Error को हमेंशा एक तरीके से Check किया जाता है और उसे एक ही तरीके से Handle किया जाता है।
हालांकि ये भी सम्भव है कि हम ios के Error-Status Bits का प्रयोग करके अधिक अच्छे व Managed तरीके से File I/O Errors को Handle करें। इनमें से कुछ Status Bits को हमने Keyboard व Monitor I/O के लिए पहले भी उपयोग में लिया है। इस अगले Program में बताया गया है कि हम किस प्रकार से इन Error Status Bits को अपने Program में अधिक अच्छे Error Handler के रूप में Use कर सकते हैं।
// ferrors.cpp // checks for errors opening file #include <fstream.h> // for file functions void main() { ifstream file; file.open("GROUP.DAT", ios::nocreate); if( !file ) cout << "\nCan't open GROUP.DAT"; else cout << "\nFile opened successfully."; cout << "\nfile = " << file; cout << "\nError state = " << file.rdstate(); cout << "\ngood() = " << file.good(); cout << "\neof() = " << file.eof(); cout << "\nfail() = " << file.fail(); cout << "\nbad() = " << file.bad(); file.close(); }
ये Program सबसे पहले file Object के मान को Check करता है। यदि इसका मान Zero होता है तो इसका मतलब होता है कि सम्भवतया File Open नहीं हो पाई है, क्योंकि वह File Disk पर मौजूद नहीं है। इस स्थिति में Program का Output निम्नानुसार होता है:
// Output Can't open GROUP.DAT file = 0x1c730000 Error state = 4 good() = 0 eof() = 0 fail() = 4 bad() = 4
rdstate() से हमें Error State के रूप में 4 प्राप्त होता है। जब इस Bit का मान 1 होता है, तब Bit ये Indication देता है कि File Disk पर उपलब्ध नहीं है। इसके अलावा सभी Bits का मान 0 Set रहता है। good() Function केवल उस स्थिति में True या 1 Return करता है, जब कोई भी Bit Set नहीं हुई होती है, इसलिए ये False या 0 Return करता है।
चूंकि हम EOF पर पहुंच ही नहीं पास हैं, इसलिए eof() Function 0 Return करता है। fail() व bad() Function एक Nonzero मान Return करते हैं, क्योंकि Error Generate हो गया है। जब हम Professional Program Develop करते हैं, तब ये या इन में से ज्यादातर Functions को हर I/O Operation के बाद ये Ensure करने के लिए Use किया जाता है कि कोई Error Generate हुआ है या नहीं। (fstream Class – CPlusPlus)
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF