Memory as Stream Object and Buffer

Memory as Stream Object and Buffer: हम Memory के एक हिस्से को Stream Object की तरह Treat कर सकते हैं और इसमें ठीक उसी तरह से Data Insert कर सकते हैं, जिस तरह से किसी File में रखते हैं। इसे In-Memory Formatting कहते हैं। ये तकनीक कई स्थितियों में बहुत ही उपयोगी साबित होती है।

उदाहरण के लिए GUI Environments में वे Functions जो कि Dialog Box में Data Write करते हैं या वह Window जिसे String प्रकार के Data की जरूरत होती है, चाहे वह String Numbers ही क्यों ना हो। ये तरीका Memory के एक हिस्से में iostreams को Use करते हुए विभिन्न प्रकार की Formatting के साथ इस String को Compose करने की सुविधा देता है और फिर एक GUI Function को Call करके इस String को Argument के रूप में Dialog Box पर भेज देता है।

ये तरीका बिल्कुल उसी प्रकार Use किया जाता है जिस प्रकार से एक C Programmer sprintf() Function Use करता है। कई और भी स्थितियां होती हैं जहां हम In–Memory Formatting को काफी अच्छे व Convenient तरीके से Use करते हैं।

Fixed Buffer Size

Stream Classes का एक समूह इस प्रकार के In – Memory Formatting को Implement करता है। Memory में Output करने के लिए ostrstream Class है जो कि ostream Class से Derive की गई है। Memory में Input के लिए  istrstream Class है जिसे istream Class से Derive किया गया है। Memory Stream Objects को Use करने के लिए हमें हमारे Program में STESTREA.H Header File को Include करना पडता है। अगले उदाहरण में बताया गया है कि हम किस प्रकार से ostrstream istrstream दोनों Classes के Objects को Use कर सकते हैं।

// strstr.cpp
// strstream memory objects
#include <strstrea.h>               		// for ostrstream class
const int SIZE = 80				// size of memory buffer

void main()
{
	char membuff[SIZE];                	// buffer in memory
	ostrstream omem(membuff, SIZE);  	// make output memory object

	int oj = 77;                     	// data variables
	double od = 890.12;              	// for output to memory
	char ostr1[] = "Kafka";
	char ostr2[] = "Freud";

	omem << "oj= " << oj << endl       	// output data to
	<< "od= " << od << endl    		// memory object
	<< "ostr1= " << ostr1 << endl
	<< "ostr2= " << ostr2 << endl
	<< ends; 				// end the buffer with '\0'

	cout << membuff; 			// display the memory buffer

	char dummy[20]; 			// new variables for input
	int ij;
	double id;
	char istr1[20];
	char istr2[20];

	istrstream imem(membuff, SIZE);   	// make input memory object
								// extract data
	imem >> dummy >> ij >> dummy >> id 	// into new variables
	>> dummy >> istr1>> dummy >> istr2;
						// display variables
	cout << "\nij=" << ij << "\nid=" << id
	<< "\nistr1=" << istr1 << "\nistr2=" << istr2;
}

The ostrstream Object

ostrstream Object को Use करने का एक तरीका ये है कि हम char* प्रकार का एक Buffer Create करें। फिर हम Memory Buffer को Use करते हुए ostrstream प्रकार का एक Object Create कर सकते हैं और इस char* प्रकार के Buffer व उसकी Size को Argument के रूप में Object के Constructor में भेज सकते हैं।

अब हम Formatted Texts को ostrstream Object में << Operator का प्रयोग करके ठीक उसी तरह से भेज सकते हैं जिस तरह से Texts को cout Object या Disk File में भेजते हैं। यही हमने इस Program के पहले भाग में किया है। जब हम इस Program को Run करते हैं, तब membuff निम्नानुसार Formatted Text से भर जाता है:

j= 77\nd= 890.12\nstr1= Kafka\nstr2= Freud\n\0

हम Texts को Manipulators का प्रयोग करके भी Format कर सकते हैं, ठीक उसी तरह से जिस तरह से cout Object के लिए Format करते हैं। ends Manipulator String के अन्त में एक ‘\0’ Character Insert करके String का अन्त करता है। हमें इस Manipulator का यहां पर प्रयोग करना जरूरी होता है, क्योंकि यहां पर Compiler स्वयं ये काम नहीं करता है। अब ये Program निम्नानुसार Buffer में Stored String को निम्नानुसार Print करता है। यानी यदि हम निम्नानुसार Statement Use करते हैं:

cout << membuff;

तो Resulting Output निम्नानुसार प्राप्त होता है:

oj= 77
od= 890.12
ostr1= Kafka
ostr2= Freud

इस उदाहरण में Program केवल Buffer के Contents को ही Display करता है। सामान्‍यतया इसका एक अधिक सरल उपयोग किया जा सकता है। जैसे Buffer के Address को GUI Function में Dialog Box में String को Display करने के लिए इस Formatted String का प्रयोग किया जा सकता है।

Input Memory Streams

In – Memory Formatting का जो सबसे Common Use है वह है Texts को Memory में Store करके रखना जैसाकि हमने एक ostrstream Object को Use करके किया है। हम Formatted Data को Memory से Read करके Variables में भी Store कर सकते हैं।

ये तरीका हमें ये सुविधा प्रदान करता है कि हम विभिन्न प्रकार के Alphanumerical मानों को बिना किसी Standard C Library Function जैसे कि atof() या atoi() का प्रयोग किए हुए एक ही बार में विभिन्न प्रकार के Numerical Variables में Convert कर सकते हैं।

Program का दूसरा हिस्सा एक istrstr Object imem Create करता है और इसे भी membuff Memory Buffer से Associate करता है, जिसे पहले ostrstream Object के लिए Use किया गया था। फिर Program imem से Data को Read करके Appropriate Variable में Store करता है। ये membuff में Stored Formatted char* Data को int, double या char* प्रकार के Data में Automatically Convert कर देता है। अन्त में ये Program इन Variables की Values को Display कर देता है। Program का Second Part निम्नानुसार दिखाई देता है:

ij=77
id=890.12
istr1=Kafka
istr2=Freud

एक बात ध्‍यान रखें कि ये Conversion Process तभी ठीक से काम करता है जब हम हर Individual Variable को membuff में Whitespace द्वारा Delimit या अलग-अलग रखते हैं।

यही कारण है कि हमने Program के पहले हिस्से में omem में Data को Write करते समय Equal Sign के बाद में Space का प्रयोग किया है। ये बात भी ध्‍यान रखें कि हम Data को imem से एक Individual Variable में Store करते हैं, हमें oj= जैसे किसी Text से कोई मतलब नहीं है। हम इस प्रकार की छोटी Strings को dummy नाम के Buffer से Read करते हैं और भूल जाते हैं।

Universality

In-Memory Formatting को Use करते हुए इस तकनीक पर ध्‍यान देने के लिए उदाहरण में हमने Stand Alone main() Function को Use किया है। यदि हम एक Object Oriented Program लिख रहे हों,  तो हमें सम्भवतया विभिन्न प्रकार के In-Memory Handling I/O Functions को Member Functions में Place करना पडेगा ताकि विभिन्न प्रकार के Objects को Memory में Write व Read किया जा सके।

जब हम In-Memory Formatting को Use करते समय सभी काम सही तरीके से करते हैं, तब हम उन्हीं Member Functions को Memory से Objects को Read व Write करने के लिए Use कर सकते है, जिन्हें Disk Files को Read व Write करने के लिए Use करते हैं। << व >> Operators को Overload करके Disk Files के साथ काम कीजिए। फिर File Object के नाम को (चाहे वह नाम istream, या istrstream या ostream या ostrstream Class का हो) Argument के रूप में Function में Pass करना होता है।

File Pointers

जरूरत पडने पर हम File Pointers को उसी प्रकार से Handle कर सकते हैं, जिस प्रकार से In-Memory Objects जैसे कि istrstream व ostrstream के साथ seekg() व tellp() Functions काम करते हैं, और हम File Object के साथ काम करते हैं।

Dynamic Buffer Size

ये दूसरे प्रकार का ostrstream Object है। इसमें Object को एक User Defined Buffer से Associate करने के बजाय हम एक ostrstream प्रकार का Object Create कर लेते हैं जो अपनी स्वयं की Storage Allocate करता है और उसकी Size को Dynamically Adjust करके वो सब कुछ Hold करके रखता है, जिसे हम इसमें Store करते हैं।

ऐसा करने के लिए हमें एक No Argument वाला Object Define करना पडता है। एक बार इस तरह का Object Define करने के बाद इसे Data से Fill करना होता है और ये Object वह सब कुछ Hold करने के लिए Expand हो जाता है, जिसे हम इसमें Store करना चाहते हैं। हम जैसे: जैसे इसमें Data Add करते जाते हैं इसकी Size बढती जाती है।

	// autostr.cpp
	// writes formatted data into memory; uses dynamic ostrstream
	#include <strstrea.h>        		// for ostrstream class

	void main()
	{
	   ostrstream omem;			// create dynamic stream object

	   omem << "j=" << 111 << endl       	// insert numbers
			 << "k=" << 2.3456 << endl;  // into ostrstream object
	   omem << ends;                      	// terminate with '\0'

	   char* p = omem.str();             	// get address of buffer
	   cout << p;                       	// display it
	}

इस Program में हमने एक Dynamic ostrstream Object Create किया है और उसमें एक Integer Data 111 व एक Floating Point मान 2.3456 को Data के रूप में Store किया है। हमने str() Member Function का प्रयोग करके char* प्रकार का एक Pointer Return किया है, जो कि उस Memory का Pointer है जिसमें Data Stored है। यानी:

char* p = omem.str();

ये Pointer किसी अन्‍य Function में भेजकर Data को Display किया जा सकता है या उसे किसी अन्‍य उपयोग के लिए Access किया जा सकता है। इस Program में हमने इस Pointer को cout में Insert किया है:

cout << p;

इस Statement द्वारा हमें निम्नानुसार Output प्राप्त होता है:

j=111
k=2.3456

सामान्‍यतया इस Pointer Value को किसी GUI Function में Data को Display करने के लिए भेजा जाता है। (Memory as Stream Object – StackOverflow)

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS