file handling हमें सुविधा देता है की हम एक file में user input को store करा सकें जिससे program terminate होने के बाद भी user द्वारा input किया गया data, remove या erase नहीं होता जैसे कि एक साधारण program में होता है, ऐसे में हम उस data को program को दोबारा execute करके access करते हैं। यह एक real world application की तरह व्यवहार करता है।
यहाँ पर user input को आप किसी file में दो प्रकार से store करा सकते हैं आप इसे data format कह सकते हैं।
हम इन दोनों को कुछ उदाहरणों से समझेंगे –
यहां हम दो तरीकों से data को file में store कर सकते हैं,
- Text format/character form
- Binary format
इसमें text format by default होता है।
यहाँ हम C ++ में text format और binary format को उनके अंतर से समझेंगे-
- Data can be stored in character-form in two ways-
- सामान्यत: किसी data को text format में store करने के लिए यहाँ दो तरीके दिए गए हैं –
- insertion operator (<<) to write, extraction operator (>>) to read
- put() for write, get() for read
यहाँ नीचे text format का उदाहरण दिया गया है-
#include<iostream.h>
#include<conio.h>
#include<stdio.h> // gets()
#include<fstream.h>
void main()
{
clrscr();
char *name;
ofstream fout;
cout<<"Enter Your Name :";
gets(name);
cout<<"Name: "<<name;// displaying on monitor
fout.open("text.txt");
fout<<name;//writing in file
fout.close();
getch();
}
OUTPUT
Enter Your Name : rahul singh
Name: rahul singh
The write()
and read()
functions are used for binary-form.
binary format के लिए write()
और read ()
, जो कि predefined function होते हैं , का उपयोग किया जाता है-
here is the program ,
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<fstream.h>
void main()
{
clrscr();
char *name;
ofstream fout;
cout<<"Enter Your Name :";
gets(name);
cout<<"Name: "<<name; //displaying on monitor
fout.open("binary.txt",ios::binary);
fout.write((char*)&name,sizeof(name));//writing in file
fout.close();
getch();
}
OUTPUT
Enter Your Name : rahul singh
Name: rahul singh
यहाँ पर ध्यान दें दोनों program में txt एक file extension हैं मतलब file एक text document प्रकार का होगा जबकि उसमे stored data का format different (text /binary ) होगा।
अगर << के साथ ios :: bin के प्रयोग करते हैं जैसे –
fout.open("text.txt",ios::bin);
fout<<name;
तब भी यह data को text format में store करेगा।
और अगर write()
के साथ ios :: binary
का प्रयोग नहीं करते हैं जैसे –
fout.open("binary.txt");
fout.write((char*)&name,sizeof(name));
तो यह केवल एक सीमा तक ही record को binary format में store करेगा इसलिए binary format के लिए ios::binary
के साथ write()
function अनिवार्य है इसका उदाहरण पेज के अंतिम में दिया गया है।
-
- text format में data जो type होगा वह उसी रूप में file में store होगा-
- जबकि binary format में data कुछ इस प्रकार स्टोर होगा-
- text format binary format की तुलना में अधिक memory size लेता है जैसे – कोई नाम “rahul singh ” किसी file में इस प्रकार size लेगा-
क्योंकि हम जानते हैं कि char का मेमोरी साइज़ 1 byte होता है, इसलिए प्रत्येक character के लिए 1 byte (blank string भी 1 byte लेगा) जैसे की ऊपर Diagram से पता चलता है। इसलिए इस file का size 11 byte होगा –
- और अब binary format में उसी value को store करने पर ,
क्योंकि int
का memory size 2 byte होता है, इसलिए इसका file size 2 bytes होगा –
अब आप देख सकते हैं कि जब हम एक ही data को पहले character format में यह 11 बाइट ले रहा है जबकि binary format में store करने में केवल 2 बाइट लेता है।
- text format में store data का size binary format में store से ज्यादा होता है इसलिए binary format को text format की अपेक्षा ज्यादा जल्दी access किया जा सकता है।
क्योंकि data text format में store किया जाता है इसलिए इसे आसानी से पढ़ा जा सकता है मान लीजिए कि user ने कोई नाम “rahul singh ” store किया तो ,
binary format में stored data file कुछ special character में convert हो जाता है जिसे आसानी इंसान नहीं पढ़ सकता-
साथ ही इसे binary format को केवल उसी program से access किया जा सकता है जिससे इसे write /store किया गया हो जबकि text format stored data को बिना program के भी read किया जा सकता है जिसे की backside से access किया जाता है ऐसे में security कम हो जाती है-
अब हम जानते हैं कि binary format में stored data सुरक्षित और fast accessing provide कराता है।
लेकिन character format में stored data का भी एक फायदा है, जैसे कि किसी project में कुछ advance task जैसे student marksheet, bill receipt आदि को प्रिंट करने में। हम इस तरह के task को करने के लिए text format का इस्तेमाल कर सकते हैं।
यह आवश्यक नहीं है कि हम केवल student मार्कशीट को प्रिंट करने के लिए text format का उपयोग कर सकते हैं। यह उन सभी के लिए एक बेहतर विकल्प है, जहाँ पर हमें physical record की आवश्यकता पड़ती है। परन्तु जहाँ पर केवल बात storage की है तो वहां पर binary format बेहतर विकल्प होगा।
Extra
binary-format में data को स्टोर करने के लिए हम नीचे दिए गए syntax का प्रयोग करते हैं –
परन्तु यहाँ पर हमने ios :: binary
इस्तेमाल नहीं किया है फिर भी यह data को binary format में store करता है
इसका मतलब हम दो तरीके से data को binary format में store कर रहे हैं
First case
fout.open("binary.txt") // without ios:: binary
fout.write((char*)&name,sizeof(name));
Second case
fout.open("binary.txt",ios::binary) //
fout.write((char*)&name,sizeof(name));
दोनों data को binary format में store करेंगे। लेकिन अब सवाल यह उठता है कि क्या ios :: binary
optional है?
नहीं। ऐसा इसलिए है क्योंकि एक large volume data को store करने के लिए ios :: binary
अनिवार्य हो जाता है।
चलिए इसे एक उदाहरण से समझते हैं-
यहाँ नीचे program 15 बार execute किया गया है (इसका मतलब है कि हम एक ही file को 15 बार write करते हैं )
- बिना
ios :: binary
के
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
class example
{
public:
int number;
void write();
void read();
};
example obj; // object created
void example:: write(void)
{
clrscr();
ofstream fout;
cout<<"Press any key to write file:";
fout.open("myfile.txt",ios::app);
fout.write((char*)&obj,sizeof(example));
fout.close();
}
void example::read(void)
{
ifstream fin;
fin.open("myfile.txt");
while(fin.read((char*)&obj,sizeof(example)))
{
cout<<number<<endl;
}
fin.close();
}
//main program start here
void main()
{
clrscr();
//write a file 15th time
obj.number=1; obj.write();
obj.number=2; obj.write();
obj.number=3; obj.write();
obj.number=4; obj.write();
obj.number=5; obj.write();
obj.number=6; obj.write();
obj.number=7; obj.write();
obj.number=8; obj.write();
obj.number=9; obj.write();
obj.number=10; obj.write();
obj.number=11; obj.write();
obj.number=12; obj.write();
obj.number=13; obj.write();
obj.number=14; obj.write();
obj.number=15; obj.write();
getch(); //hold the screen
clrscr();
obj.read(); //displaying file content
getch();
}
OUTPUT
Press any key to continue
1
2
3
4
5
6
7
8
9
10
11
12
13
9083
5432
32159
अब हम उपरोक्त आउटपुट देख सकते हैं हम नंबर 1-15 को store करते हैं, लेकिन ऐसा नहीं होता है और नंबर 13 के बाद garbage value प्रिंट होता है।
-
- with
ios::binary
mode
- with
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
class example
{
public:
int number;
void write();
void read();
};
example obj; // object created
void example:: write(void)
{
clrscr();
ofstream fout;
cout<<"Press any key to write file:";
fout.open("myfile.txt",ios::binary|ios::app);
fout.write((char*)&obj,sizeof(example));
fout.close();
}
void example::read(void)
{
ifstream fin;
fin.open("myfile.txt",ios::binary);
while(fin.read((char*)&obj,sizeof(example)))
{
cout<<number<<endl;
}
fin.close();
}
//main program start here
void main()
{
clrscr();
//write a file 15th time
obj.number=1; obj.write();
obj.number=2; obj.write();
obj.number=3; obj.write();
obj.number=4; obj.write();
obj.number=5; obj.write();
obj.number=6; obj.write();
obj.number=7; obj.write();
obj.number=8; obj.write();
obj.number=9; obj.write();
obj.number=10; obj.write();
obj.number=11; obj.write();
obj.number=12; obj.write();
obj.number=13; obj.write();
obj.number=14; obj.write();
obj.number=15; obj.write();
getch(); //hold the screen
clrscr();
obj.read(); //displaying file content
getch();
}
OUTPUT
Press any key to continue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
अगर कोई large volume data , numeric types का है तो ios::binary
अनिवार्य होगा जबकि characters types के data के लिए यह optional होगा।
⚠️: The programs given in this article are based on Windows 10, 64-bit OS, x64 based pro and executed on Turbo C++ 64bit version.
Related exercise