Stream Classes in C++: Input व Output में Data के Flow का General नाम Stream है। इस कारण से C++ में Streams को iostream कहा जाता है। एक iostream को किसी Particular Class के Object के रूप में Represent किया जा सकता है। उदाहरण के लिए अभी तक हमने cin व cout stream Objects के कई उदाहरण देखे हैं।
जिन लोगों ने “C” सीखा है वे सोच सकते हैं कि Traditional I/O के स्थान पर ये Stream Classes किस प्रकार से ज्यादा उपयोगी होंगे। तो इसका जवाब ये है कि stream Classes Traditional I/O की तुलना में कम Error Create करने वाले होते हैं। यदि आपने “C” सीखा है तो आपको पता होगा कि यदि आप %d Control String के स्थान पर गलती से %f Control String का प्रयोग कर दें, तो आपको अपना मनचाहा Result प्राप्त नहीं होता है।
लेकिन “C++” की stream में इस प्रकार के किसी Control String का प्रयोग नहीं किया जाता है, क्योंकि stream का Object स्वयं ये जानता है कि उसे किस प्रकार से किसी Data को Display करना है या किस प्रकार के मान को Object में Input करना है। streams का प्रयोग करने से Program में Syntax लिखने के कारण होने वाली ज्यादातर Mistakes नहीं होती हैं।
हम किसी Existing Operator या Function को Overload करके अपनी Create की गई Class के साथ Use कर सकते हैं, जैसे कि Insertion (<<) व Extraction (>>) Operators को किया गया है। C++ की ये सुविधा हमें हमारी Classes को उसी तरह से Use करने की क्षमता प्रदान करती हैं जिस तरह से हम Basic Data Type को Use करते हैं। इससे हमें Programming करने में सरलता होती है और हमारा Program ज्यादा Error Free होता है।
यदि हम Graphics Programming करना चाहें तो C के Traditional I/O को किसी प्रकार से Use नहीं कर सकते हैं, जबकि iostream Graphics Programming में भी पूरी तरह से उपयोगी साबित होते हैं। क्योंकि ये हमें एक Best तरीका प्रदान करते हैं, जिससे हम Data को Files में Write कर सकते हैं और Memory में Format कर सकते हैं, ताकि इन Formatted Data का प्रयोग बाद में किसी दूसरे GUI व Dialog Box में किया जा सके।
Stream Classes Hierarchy
Stream Classes को एक Complex Hierarchy के रूप में देखा जा सकता है। हालांकि हमें I/O के लिए इस Hierarchy को पूरी तरह से जानना उतना जरूरी नहीं है। लेकिन फिर भी थोडा बहुत समझ लेना काफी उपयोगी होता है।
हमने पहले भी कुछ stream Classes का प्रयोग किया है। extraction Operator >> istream Class का एक Member है और Insertion Operator << ostream Class का एक Member है। इन दोनों Classes को एक ios Class से Derived किया गया है। cout Object Standard Output stream को Represent करता है, जो कि Video Display के लिए जिम्मेदार होता है और ये ostream_withassign Class का Predefined Object है और ये Class ostream Class से Derived है। इसी तरह से cin istream_withassign Class का Object है जो कि istream Class से Derived है।
वे Classes जो कि Video Display पर Output भेजने का काम करती हैं और Keyboard से Input लेने का काम करती हैं, iostream.h नाम की Header File में Declare किए गए हैं। इस Header File को हमने हमारे हर Program में Include किया है। वे Classes जो मुख्य रूप से केवल Disk Files के लिए ही उपयोगी हैं, उन्हें FSTREAM.H नाम की Header File में Define किया गया है।
ios Class iostream Hierarchy की Base Class है। इसमें कई Constants व Member Functions है, जो सभी प्रकार के Input व Output के लिए Common हैं। इनमें से कुछ जैसे कि showpoint व fixed Formatting Flags, हमने पहले ही देख लिए हैं। ios Class में streambuf Class का एक Pointer भी है जिसमें Actual Memory Buffers होता है।
इसी Memory Buffer द्वारा Data Read होते हैं व इसी Memory Buffer में Data Write होते हैं। साथ ही विभिन्न प्रकार के Low-Level Routines इन Data को यहीं पर Handle करके Input से लेते हैं और Output में Screen पर Print करते हैं। यानी streambuf Class में कुछ Low Level Routines भी हैं, जो Buffer के Data को Handle करते हैं।
सामान्यतया हमें streambuf Class के बारे में सोचनें की जरूरत नहीं होती है। इस Class को अन्य Classes द्वारा आवश्यकतानुसार Automatically Use कर लिया जाता है। लेकिन कई बार इस Buffer को Use करना काफी सुविधाजनक होता है।
istream Class व ostream Class को ios Class से Derived किया गया है और ये क्रमश: Input व Output के लिए जिम्मेदार होते हैं। istream Class में get(), getline(), read() जैसे Member Functions और Extraction (>>) Operator होते हैं जबकि ostream Class में put(), write() व Insertion (<<) Operators होते हैं।
iostream Class को istream व ostream दोनों Classes से Multiple Inheritance द्वारा Derive किया गया है। iostream Class से Derived Classes को Devices जैसे कि Disk Files के साथ Use किया जा सकता है, जो कि एक ही समय में Input व Output दोनों का काम कर सकते हैं। istream_withassign, ostream_withassign व iostream_withassign ये तीनों Classes क्रमश: istream, ostream व iostream से Inherit या Derive की गई हैं। इनमें Assignment Operators को Add किया गया है, ताकि cin, cout व इसी तरह के अन्य Operators को दूसरी Streams के साथ भी Assign किया जा सके।
Stream Classes in C++ : The ios Class
ios Class सभी अन्य Classes से बडी होती है और इसमें C++ Stream पर Operate होने वाले सबसे ज्यादा Features होते हैं। इस Class के तीन सबसे महत्वपूर्ण Features Formatting Flags, Error-Status Bits व File Operation Modes हैं।
Formatting Flags
Formatting Flags ios Class में enum Definitions का एक समूह है। ये On/Off Switches की तरह काम करते हुए Input व Output Format व Operations के विभिन्न Aspects की Choices को Specify करते हैं। इन Formatting Flags की Complete List निम्नानुसार है:
skipws | Skip (ignore) whitespace on input. |
left | Left adjust output [12.34 ]. |
right | Right adjust output [ 12.34]. |
internal | Use padding between sign or base indicator and number [+12.34]. |
dec | Convert to decimal. |
oct | Convert to octal. |
hex | Convert to hexadecimal. |
showbase | Use base indicator on output (0 for octal, 0x for hex). |
showpoint | Show decimal point on output. |
uppercase | Use uppercase X, E, and hex output letters ABCDEF (the default is lowercase). |
showpos | Display ‘+’ before positive integers. |
scientific | Use exponential format on floating-point output [9.1234E2]. |
fixed | Use fixed format on floating-point output [912.34]. |
unitbuf | Flush all streams after insertion. |
stdio | Flush stdout, stderror after insertion. |
Formatting Flags को Set करने के कई तरीके हैं और विभिन्न Flags को विभिन्न तरीकों से Set किया जा सकता है। चूंकि, ये सभी Flags ios Class के Members हैं, इसलिए Flags को सामान्यतया ios नाम को उपसर्ग के रूप में Use किया जाता है और Scope Resolution Operator के बाद Flag को Use किया जाता है। जैसे
ios::skipws
सभी Flags को setf() व unsetcf() ios Member Functions द्वारा Set किया जा सकता है। उदाहरण के लिए
cout.setf(ios::left); // left justify output text cout >> “This text is left-justified"; cout.unsetf(ios::left); // return to default (right justified)
कई Formatting Flags का प्रयोग Manipulators के साथ होता है, इसलिए पहले हम Manipulators को देखते हैं।
Manipulators
Manipulators वे Formatting Instructions होते हैं जिन्हें Directly किसी Stream में Insert किया जा सकता है। हमने endl Manipulator को Use किया है जो कि एक New Line Provide करता है। जैसे:
Cout << “Nandlal Gopal” << endl;
हमने setiosflags() Manipulator को भी Use किया है। यानी:
cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << var
इन दोनों उदाहरणों से हम देख सकते हैं कि Manipulators दो तरह के होते हैं। पहले वे जो एक Argument लेते हैं और दूसरे वे जो Argument नहीं लेते हैं। निम्न Table में No-Argument Manipulators को Summarized किया गया है।
Manipulator | Purpose |
ws | Turn on whitespace skipping on input. |
dec | Convert to decimal. |
oct | Convert to octal. |
hex | Convert to hexadecimal. |
endl | Insert new line and flush the output stream. |
ends | Insert null character to terminate an output string. |
flush | Flush the output stream. |
lock | Lock file handle. |
unlock | Unlock file handle. |
हम इन Manipulators को Directly stream में Insert कर सकते हैं। उदाहरण के लिए var के मान को Hexadecimal मान के Format में Display करने के लिए हम निम्न Statement लिख सकते हैं:
cout << hex << var;
ये Statement No-Argument Manipulator को तब तक Effect में रखता है जब तक कि stream Destroy नहीं हो जाता। इसलिए हम एक बार hex Manipulator को Use करके कई Numbers को Hexadecimal Format में Print कर सकते हैं। निम्न Table के Manipulators Arguments लेते हैं।
Manipulator | Argument | Purpose |
setw() | field width (int) | Set field width for output. |
setfill() | fill character (int) | Set fill character for output (default is a space). |
setprecision() | Precision (int) | Set precision (number of digits displayed). |
setiosflags() | formatting flags (long) | Set specified flags. |
resetiosflags() | formatting flags (long) | Clear specified flags. |
वे Manipulators जो Argument लेते हैं, केवल उस Item पर Effect करते हैं, जिसके पहले इन्हें Use किया गया होता है। उदाहरण के लिए किसी Number को Display करने के लिए यदि Fields की संख्या तय करनी हो तो हम setw() Manipulator का प्रयोग करते हैं। यदि हमें दूसरे Number के Fields की संख्या भी तय करनी हो तो हमें दुबारा ये Manipulator Use करना पडता है। जैसे:
cout << “TTime “ << setw(2) << hours << setw(2) << minutes;
Functions
Ios Class में कई Functions भी हैं जिनका प्रयोग Formatting Flags को Set करने व विभिन्न काम करने के लिए किया जा सकता है। निम्न Table में उन Functions को बताया गया है जो Errors के साथ Deal नहीं करते हैं।
Function | Purpose |
ch = fill(); | Return the fill character (fills unused part of field; default is space). |
fill(ch); | Set the fill character. |
p = precision() | Get the precision (number of digits displayed for floating point). |
precision(p); | Set the precision. |
w = width(); | Get the current field width (in characters). |
width(w); | Set the current field width. |
setf(flags); | Set specified formatting flags (e.g., ios::left). |
unsetf(flags); | Unset specified formatting flags. |
setf(flags, field); | First clear field, then set flags. |
इन Functions को किसी Specific stream के Object के लिए Dot Operator का प्रयोग करके Call किया जाता है। उदाहरण के लिए Field Width को 21 Set करने के लिए हम निम्नानुसार Statement लिख सकते हैं:
cout.width(21);
इसी तरह से निम्न Statement Fill Character को (*) Asterisk Set कर देता है:
cout.fill(*’);
हम ios Formatting Flags को Directly Manipulate करने के लिए कई Functions का प्रयोग कर सकते हैं। जैसे Left Justification Set करने के लिए हम निम्न Statement लिख सकते हैं:
cout.setf(ios::left);
वापस Right Justification Set करने के लिए हम निम्न Statement लिख सकते हैं:
cout.unsetf(ios::left);
setf() Function का 2-Argumnent वाला Version दूसरे Argument का प्रयोग किसी Particular Type या Field के सभी Flags को Reset करने के लिए करता है। फिर पहले Argument में Specify किया गया Flag Set हो जाता है। ये Function नया Flag Set करने से पहले सभी Set Flags को Reset कर देता है। निम्न Table इस Arrangement को Show कर रहा है:
First argument: flags to set | Second argument; field to clear |
dec, oct, hex | basefield |
left, right, internal | adjustfield |
scientific, fixed | floatfield |
जैसे:
cout.set(ios::left, ios::adjustfield);
ये Statement सभी Flags को Clear कर देता है, फिर left Flag को Left Justification के लिए Set कर देता है। इस प्रकार से हम Input व Output के लिए Formatting कर सकते हैं। ये Formatting ना केवल Display व Keyboard के लिए करते हैं, बल्कि Files के लिए भी कर सकते हैं।
Stream Classes in C++ : The istream Class
ios Class से Derive की गई istream Class Input Activities से सम्बंधित विभिन्न प्रकार के काम या Extractions करता है। Extraction ( >> ) व उससे सम्बंधित Output Activities तथा Insertion के सम्बंध में हम Confuse हो सकते हैं। इसलिए निम्न Table में इनके बीच के अन्तर को दर्शाने की कोशिश की गई है:
Function | Purpose |
>> | Formatted insertion for all basic and overloaded types |
get(ch); | Extract one character into ch. |
get(str); | Extract characters into array str, until ‘\0’. |
get(str, MAX); | Extract up to MAX characters into array. |
get(str, DELIM) | Extract characters into array str until specified delimiter (typically ‘\n’). Leave delimiting char in stream. |
get(str, MAX, DELIM) | Extract characters into array str until MAX characters or the DELIM character. Leave delimiting char in stream. |
getline(str, MAX, DELIM) | Extract characters into array str until MAX characters or the DELIM character. Extract delimiting character. |
putback(ch) | Insert last character read back into input stream. |
ignore(MAX, DELIM) | Extract and discard up to MAX characters until (and including) the specified delimiter (typically ‘\n’). |
peek(ch) | Read one character, leave it in stream. |
count = gcount() | Return number of characters read by a (immediately preceding) call to get(), getline(), or read(). |
read(str, MAX) | For files. Extract up to MAX characters into str until EOF. |
seekg(position) | Sets distance (in bytes) of file pointer from start of file. |
seekg(position, seek_dir) | Sets distance (in bytes) of file pointer from specified place in file: seek_dir can be ios::beg, ios::cur, ios::end. |
position = tellg(pos) | Return position (in bytes) of file pointer from start of file. |
हमने इनमें से कुछ Functions को पहले भी देखा है। उनमें से ज्यादातर Functions cin Object के साथ Use होते हैं, जो कि Keyboard को Represent करने के साथ ही Disk Files को भी Represent करता है। फिर भी अन्तिम चार Functions केवल File के साथ ही उपयोग में ली जा सकती हैं।
Stream Classes in C++ : The ostream Class
ostream Class Output या Insertion की Activities को Handle करता है। निम्न Table में Mostly Use किए जाने वाले Member Functions को बताया गया है:
Function | Purpose |
<< | Formatted extraction for all basic and overloaded types. |
put(ch); | Insert character ch into stream. |
flush(); | Flush buffer contents and insert new line. |
write(str, SIZE) | Insert SIZE characters from array str into file. |
seekp(position) | Sets distance in bytes of file pointer from start of file. |
seekp(position, seek_dir) | Set distance in bytes of file pointer from specified place in file. seek_dir can be ios::beg, ios::cur, or ios::end. |
position = tellp() | Return position of file pointer, in bytes. |
इसके भी अन्तिम चार Functions केवल Disk Files के साथ ही Use होते हैं।
Stream Classes in C++ : The iostream and the _withassign Classes
istream व ostream से Derive की गई iostream Class अन्य Classes के लिए मुख्य रूप से Base Class का काम करती है, जिससे अन्य Classes विशेष रूप से iostream_withassign को Derive किया जा सकता है।
Constructors व Destructors को छोड कर इसके स्वयं के कोई भी Functions नहीं हैं। iostream Class से Derive की गई Class Input व Output दोनों कामों को कर सकता है। हमारी Library में तीन _withassign Class है:
istream_withassign, Derived from istream
ostream_withassign, Derived from ostream
iostream_withassign, Derived from iostream
जिन Classes में Overloaded Assignment Operator है, उन Classes को छोड कर शेष Classes से _withassign Classes को Derive किया गया है। इसलिए इनके Objects को Copy किया जा सकता है। Stream Library में कुछ Classes के Objects को Copy नहीं किया जा सकता है जबकि कुछ Class के Objects को Copy किया जा सकता है। Stream Library को ऐसा इसलिए Design किया गया है, क्योंकि किसी Stream Class के Object को Copy नहीं करना चाहिए। क्योंकि इस प्रकार का हर Object किसी ना किसी अमुक streambuf Object से Associated रहता है।
ये streambuf Object Memory में Data को Store करके रखने के लिए कुछ Memory Area Use करता है। इसलिए यदि हम Stream Object को Copy करते हैं, तो इस तथ्; के सम्बंध में Confusion हो जाएगा, कि हम streambuf Object को भी Copy कर रहे हैं, या नहीं। फिर भी कुछ स्थितियों में Stream Objects को Copy करना महत्वपूर्ण व जरूरी होता है, जैसाकि Redirection के सम्बंध में Predefined Objects cin व cout को Copy किया जाता है।
istream, ostream व iostream Classes को उनके Overloaded Copy Constructor व Assignment Operator को Private करके Uncopyable कर दिया गया है, जबकि इनसे Derive की गई _withassign Classes के Objects को Copy किया जा सकता है।
Stream Classes in C++ : Predefined Stream Objects
cin व cout Objects के द्वारा हमने _withassign Classes से Derived Predefined Stream Objects को Use करना सीख लिया है। ये सामान्यतया Keyboard व Monitor से सम्बंधित Objects हैं। दो अन्य Predefined Objects cerr व clog हैं। निम्न Table में इन चारों को बताया गया है:
Class | Used for |
cin | istream_withassign (Keyboard input) |
cout | ostream_withassign (Normal screen output) |
cerr | ostream_withassign (Error output) |
clog | ostream_withassign (Log output) |
cerr Object का प्रयोग सामान्यतया Error Messages Display करने व Program Diagnostics के लिए किया जाता है। जो भी Output cerr पर भेजा जाता है, वह तुरन्त Monitor पर Display हो जाता है। जबकि हम जो Output cout Output Object पर भेजते हैं, वह Output पहले cout के Buffer में जाता है, फिर Monitor पर Display होने के लिए जाता है। साथ ही cerr पर जो Output भेजा जाता है, उसे Redirect नहीं किया जा सकता।
cerr Object का प्रयोग Output देखने के लिए हम उस स्थिति में कर सकते हैं, जब हमारा Program पूरा होने से पहले ही Terminate हो रहा होता है। clog Object cerr Object के समान ही है। यानी इसे भी Redirect नहीं किया जा सकताए लेकिन इसका Output Buffer में जाता है, जबकि cerr का Output Buffer में नहीं जाता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF