file input/output in c in hindi| c में फ़ाइल इनपुट/आउटपुट क्या होता है?

file input/output in c in hindi

c में फ़ाइल इनपुट/आउटपुट क्या होता है?

अक्सर डेटा इतना बड़ा होता है कि यह सब मेमोरी में स्टोर नहीं किया जा सकता है और इसकी सीमित मात्रा को ही स्क्रीन पर प्रदर्शित किया जा सकता है। इसके अलावा, स्मृति अस्थिर है और प्रोग्राम समाप्त होने के बाद इसकी सामग्री या डेटा खो जाएगी। ऐसे समय में, डेटा को डिस्क पर एक ‘फ़ाइल’ में संग्रहीत करना आवश्यक हो जाता है ताकि बाद में इसे पुनः प्राप्त किया जा सके, उपयोग किया जा सके और आंशिक या पूर्ण रूप से प्रदर्शित किया जा सके। यह अध्याय चर्चा करता है कि फ़ाइल I/O संचालन कैसे किया जा सकता है।

File Operations(फ़ाइल संचालन)

एक फाइल पर अलग-अलग ऑपरेशन किए जा सकते हैं।

  1. एक नई फाइल का निर्माण
  2. एक मौजूदा फाइल खोलना
  3. एक फाइल से पढ़ना 
  4. एक फाइल को लिखना
  5. फ़ाइल में एक विशिष्ट स्थान पर जाना (मांगना)
  6. किसी फाइल को बंद करना

आइए किसी फ़ाइल को पढ़ने और उसकी सामग्री को स्क्रीन पर प्रदर्शित करने के लिए एक प्रोग्राम लिखें। हम पहले प्रोग्राम को सूचीबद्ध करेंगे और दिखाएंगे कि यह क्या करता है, और फिर इसे लाइन-बाय-लाइन विच्छेदित करेंगे। यहाँ लिस्टिंग है|

/* Display contents of a file on screen. */ 

#include <stdio.h>
int main()
{
     FILE *fp;
     char ch;
     fp = fopen("PR1.C","r");
     while (1)
{
    ch=fgetc (fp); 
    if (ch==EOF) 
    break; 
   printf("%c", ch);

}

  printf ("\n");
  fclose(fp);
  return 0;
}

इस प्रोग्राम के निष्पादन (execution) पर यह स्क्रीन पर ‘PRI.C’ फ़ाइल की सामग्री प्रदर्शित करता है। आइए अब समझते हैं कि यह ऐसा कैसे करता है।

एक फाइल खोलना(Opening a File)

प्रोग्राम का मूल तर्क इस प्रकार है:

  • फ़ाइल से एक चरित्र पढ़ें।
  • स्क्रीन पर पढ़े गए चरित्र को प्रदर्शित करें। 
  • फ़ाइल में सभी वर्णों के लिए चरण 
  • और 
  • दोहराएं।

हर बार जब हम इससे एक चरित्र पढ़ना चाहते हैं तो डिस्क तक पहुंचना काफी अक्षम होगा। फ़ाइल खोलते समय फ़ाइल की सामग्री को बफर में पढ़ना और फिर डिस्क के बजाय बफर से चरित्र द्वारा फ़ाइल वर्ण पढ़ना अधिक समझदार होगा। यह चित्र 19.1 में दिखाया गया है।

Sirf Padhai

फ़ाइल में जानकारी लिखने पर भी यही तर्क लागू होता है। डिस्क पर फ़ाइल में एक बार में एक वर्ण लिखने के बजाय, एक बफर में वर्ण लिखना और फिर अंत में सामग्री को बफर से डिस्क में स्थानांतरित करना अधिक कुशल होगा।

इससे पहले कि हम डिस्क पर किसी फ़ाइल से (से) जानकारी पढ़ सकें (या लिख ​​सकें) हमें फ़ाइल खोलनी होगी। फाइल को खोलने के लिए हमने फंक्शन fopen() को कॉल किया है। यह एक फ़ाइल “PR1.C” को ‘रीड’ मोड में खोलेगा, जिसका अर्थ है कि हम फ़ाइल की सामग्री को पढ़ रहे होंगे। वास्तव में fopen() जब आप फ़ाइल को “r” मोड में खोलते हैं तो तीन महत्वपूर्ण कार्य करता है|

  • सबसे पहले, यह डिस्क पर खोली जाने वाली फाइल को खोजता है।
  • फिर यह डिस्क से फाइल को बफर में लोड करता है। 
  • यह एक कैरेक्टर पॉइंटर सेट करता है जो बफर के पहले कैरेक्टर को इंगित करता है।
  • यह एक फ़ाइल संरचना स्थापित करता है और अपना पता देता है।

आइए FILE संरचना के उद्देश्य को समझते हैं। किसी फ़ाइल से सफलतापूर्वक पढ़ने में सक्षम होने के लिए, खोलने का तरीका, फ़ाइल का आकार, फ़ाइल में जगह जहाँ से अगला रीड ऑपरेशन किया जाएगा, आदि जैसी जानकारी को बनाए रखना होगा। चूंकि यह सारी जानकारी आपस में जुड़ी हुई है, यह सब fopen () द्वारा FILE नामक संरचना में सेट किया गया है, fopen () इस संरचना का पता देता है, जिसे हमने fp नामक संरचना सूचक में एकत्र किया है। हमने fp को इस प्रकार घोषित किया है|

FILE *fp;

फ़ाइल संरचना को हेडर फ़ाइल “stdio.h” (मानक इनपुट/आउटपुट हेडर फ़ाइल के लिए खड़ा) में परिभाषित किया गया है।

एक फ़ाइल से पढ़ना

call to fopen() एक पॉइंटर सेट करता है जो पहले कैरेक्टर को इंगित करता है बफर। यह सूचक उस संरचना के तत्वों में से एक है जिसकी ओर fp इंगित कर रहा है (चित्र 19.1 देखें)।

बफर से फ़ाइल की सामग्री को पढ़ने के लिए हमने fgetc() को निम्नानुसार बुलाया है।

ch=fgetc (fp);

fgetc() वर्तमान सूचक स्थिति से वर्ण को पढ़ता है, सूचक स्थिति को आगे बढ़ाता है ताकि यह अब अगले वर्ण की ओर इशारा करे, और पढ़ा गया वर्ण लौटाता है, जिसे हमने चर ch में एकत्र किया था। ध्यान दें कि एक बार फ़ाइल खोलने के बाद, हम फ़ाइल को उसके नाम से नहीं, बल्कि फ़ाइल पॉइंटर fp के माध्यम से संदर्भित करते हैं।

हमने लूप के दौरान अनंत में fgetc () फ़ंक्शन का उपयोग किया है। जब फ़ाइल के सभी वर्ण पढ़े जा चुके हों, तो हमें इस लूप से बाहर निकल जाना चाहिए। लेकिन हमें यह कैसे पता चलेगा? ठीक है, fgetc() एक मैक्रो EOF (फ़ाइल का अंत) देता है, एक बार सभी वर्णों को पढ़ लिया गया है और हम एक और वर्ण पढ़ने का प्रयास करते हैं। EOF मैक्रो को “stdio.h” फ़ाइल में परिभाषित किया गया है।

फ़ाइल बंद करना

जब हमने फ़ाइल से पढ़ना समाप्त कर लिया है, तो हमें इसे बंद करना होगा। यह कथन के माध्यम से fclose () फ़ंक्शन का उपयोग करके किया जाता है,

fclose(fp);

एक बार जब हम फ़ाइल को बंद कर देते हैं, तो हम इसे fgetc () का उपयोग करके नहीं पढ़ सकते हैं। ध्यान दें कि फ़ाइल को बंद करने के लिए, हम फ़ाइल नाम का उपयोग नहीं करते बल्कि फ़ाइल पॉइंटर fp. फाइल को बंद करने पर फाइल से जुड़े बफर को मेमोरी से हटा दिया जाता है।

इस प्रोग्राम में हमने पढ़ने के लिए फ़ाइल खोली है मान लीजिए हम एक फ़ाइल खोलते हैं, जिसमें वर्ण लिखने का इरादा है। इस बार भी एक बफर इससे जुड़ जाएगा। जब हम fputc() का उपयोग करके इस फ़ाइल में वर्ण लिखने का प्रयास करते हैं तो वर्ण बफर को लिखे जाएंगे। जब हम fclose () का उपयोग करके इस फाइल को बंद करते हैं तो दो ऑपरेशन किए जाएंगे|

  1. बफर में वर्ण डिस्क पर फ़ाइल में लिखे जाएंगे 
  2. बफर को स्मृति से हटा दिया जाएगा।

आप एक संभावना की कल्पना कर सकते हैं जब हम फ़ाइल को बंद करने से पहले बफ़र भर सकते हैं। ऐसे मामले में बफर की सामग्री डिस्क पर लिखी जाएगी जैसे ही वह भर जाती है। यह सारा बफर प्रबंधन हमारे लिए पुस्तकालय के कार्यों द्वारा किया जाता है।

स्पेस , टैब, रिक्त स्थान की गणना करना।

पहली फ़ाइल I/O प्रोग्राम को समझने के बाद, आइए एक प्रोग्राम लिखें जो एक फ़ाइल को पढ़ेगा और गिनेगा कि उसमें कितने वर्ण, रिक्त स्थान, टैब और न्यूलाइन मौजूद हैं। ये रहा प्रोग्राम.

/* Count chars, spaces, tabs and newlines in a file "/ 

#include <stdio.h> 

int main()

{
      FILE *fp;
      char ch;
     int nol = 0, not = 0, nob=0, noc = 0; 
     fp = fopen ("PR1C", "T"); 
    while (1)
{
   ch=fgetc (fp); 
   if (ch == EOF)
     break;
noc++
if (ch ==' ')
nob++;
if (ch == '\n')
no|++;
if (ch == '\t')
not++;
}
fclose(fp);
printf ("Number of characters = %d\n", noc);
printf ("Number of blanks = %d\n", nob);
printf ("Number of tabs = %d\n", not); 
printf ("Number of lines = %d\n", nol);
return 0;
}

Here is sample run…

Number of characters=125
Number of blanks=25
Number of tabs=13
Number of lines=22

उपरोक्त आँकड़े “PR1.C” फ़ाइल के लिए सही हैं, जो मेरी डिस्क पर थी। आप कोई अन्य फ़ाइल नाम दे सकते हैं और भिन्न परिणाम प्राप्त कर सकते हैं। मेरा मानना ​​है कि कार्यक्रम स्व-व्याख्यात्मक है। इस प्रोग्राम में भी हमने फाइल को पढ़ने के लिए खोल दिया है और फिर इसे कैरेक्टर-बाय-कैरेक्टर पढ़ा है। आइए अब एक प्रोग्राम का प्रयास करें जिसे लिखने के लिए एक फाइल खोलने की जरूरत है।

एक फाइल-कॉपी प्रोग्राम

हम पहले से ही fgetc() फ़ंक्शन का उपयोग कर चुके हैं जो फ़ाइल से वर्णों को पढ़ता है। इसका समकक्ष fputc() नामक एक फ़ंक्शन है जो फ़ाइल में वर्ण लिखता है। इन कैरेक्टर I/O फ़ंक्शंस के व्यावहारिक उपयोग के रूप में, हम एक फ़ाइल की सामग्री को दूसरे में कॉपी कर सकते हैं, जैसा कि निम्नलिखित प्रोग्राम में दिखाया गया है। यह प्रोग्राम एक फ़ाइल की सामग्री लेता है और उन्हें दूसरी फ़ाइल, चरित्र-दर-चरित्र में कॉपी करता है।

#include <stdio.h> 
#include <stdlib.h> 
   int main()
{
FILE *fs, *ft; 
char ch; 
fs= fopen ("pr1.c", "r"); 

if (fs == NULL) 
{
puts ("Cannot open source file"); exit (1);

} 

ft = fopen("pr2.c", "w");
If(ft==NULL)
{
  puts("Connot open target file");
   fclose(fs); exit(2);
}
while(1)
{
  ch=fgetc(fs);
  if(ch==EOF)
   Break; 
   else
     fputc(ch,ft);
}
fclose (fs); fclose (ft);
Return0;
}

एक संभावना है कि जब हम fopen () फ़ंक्शन का उपयोग करके किसी फ़ाइल को खोलने का प्रयास करते हैं, तो फ़ाइल नहीं खोली जा सकती है। फ़ाइल को “r” मोड में खोलते समय, ऐसा हो सकता है क्योंकि खोली जा रही फ़ाइल डिस्क पर बिल्कुल भी मौजूद नहीं हो सकती है। और आप स्पष्ट रूप से ऐसी फ़ाइल नहीं पढ़ सकते जो मौजूद नहीं है।

इसी तरह, फ़ाइल को लिखने के लिए खोलते समय, fopen () कई कारणों से विफल हो सकता है, जैसे, नई फ़ाइल बनाने के लिए डिस्क स्थान अपर्याप्त हो सकता है, या डिस्क संरक्षित लिखा जा सकता है या डिस्क क्षतिग्रस्त हो सकती है और इसी तरह।

यदि fopen() फ़ाइल खोलने में विफल रहता है तो यह NULL मान देता है (“stdio.h में #define NULL 0 के रूप में परिभाषित)। इस कार्यक्रम में हमने यह जांच कर इस संभावना को संभाला है कि क्या fs और ft NULL पर सेट हैं। यदि इनमें से कोई भी उन्हें NULL पर सेट कर दिया गया है, हमने प्रोग्राम के निष्पादन को समाप्त करने के लिए निकास () फ़ंक्शन को कॉल किया है।

यदि प्रोग्राम समाप्ति सामान्य है, तो आमतौर पर, एक मान 0 को बाहर निकलने के लिए () पास किया जाता है। एक गैर-शून्य मान प्रोग्राम की असामान्य समाप्ति को इंगित करता है। यदि कार्यक्रम में कई निकास बिंदु हैं, तो बाहर निकलने के लिए दिए गए मान () का उपयोग यह पता लगाने के लिए किया जा सकता है कि कार्यक्रम का निष्पादन कहां से समाप्त हुआ।

fputc() फ़ंक्शन ft द्वारा इंगित फ़ाइल के लिए एक वर्ण लिखता है। लेखन प्रक्रिया तब तक जारी रहती है जब तक स्रोत फ़ाइल के सभी वर्ण लक्ष्य फ़ाइल में नहीं लिखे जाते हैं, जिसके बाद लूप समाप्त हो जाता है।

ध्यान दें कि यह फाइल-कॉपी प्रोग्राम केवल टेक्स्ट फाइलों को कॉपी करने में सक्षम है। एक्सटेंशन .EXE या JPG के साथ बाइनरी फाइलों को कॉपी करने के लिए, हमें फाइलों को बाइनरी मोड में खोलने की जरूरत है, जिसे बाद के अनुभाग में विस्तार से बताया गया है।

फ़ाइल खोलने के तरीके

निम्नलिखित मोड की एक सूची है जिसमें फ़ाइल खोलने पर fopen() द्वारा किए गए कार्यों के साथ फ़ाइल खोली जा सकती है।

“r”फ़ाइल खोजता है। यदि फ़ाइल सफलतापूर्वक खोली जाती है तो fopen() इसे मेमोरी में लोड करता है और एक पॉइंटर सेट करता है जो इसमें पहले वर्ण को इंगित करता है। यदि फ़ाइल को खोला नहीं जा सकता है, तो fopen () NULL लौटाता है।
संचालन संभव – फ़ाइल से पढ़ना।
“w”फ़ाइल खोजता है। यदि फ़ाइल मौजूद है, तो इसकी सामग्री को अधिलेखित कर दिया जाता है। यदि फ़ाइल मौजूद नहीं है, तो एक नई फ़ाइल बनाई जाती है। फ़ाइल खोलने में असमर्थ होने पर NULL लौटाता है।
फ़ाइल में संचालन संभव-लेखन।
“a”फ़ाइल खोजता है। यदि फ़ाइल सफलतापूर्वक खोली जाती है तो fopen() इसे मेमोरी में लोड करता है और एक पॉइंटर सेट करता है जो इसमें अंतिम वर्ण को इंगित करता है। यदि फ़ाइल मौजूद नहीं है, तो एक नई फ़ाइल बनाई जाती है। फ़ाइल खोलने में असमर्थ होने पर NULL लौटाता है।
फ़ाइल के अंत में नई सामग्री जोड़ना संभव है।
“r+”फ़ाइल खोजता है। यदि फ़ाइल सफलतापूर्वक खोली जाती है तो fopen() इसे मेमोरी में लोड करता है और एक पॉइंटर सेट करता है जो इसमें पहले वर्ण को इंगित करता है। फ़ाइल को खोलने में असमर्थ होने पर NULL लौटाता है।
संचालन संभव मौजूदा सामग्री को पढ़ना, नई सामग्री लिखना, फ़ाइल की मौजूदा सामग्री को संशोधित करना।
“w+”फ़ाइल खोजता है। यदि फ़ाइल मौजूद है, तो इसकी सामग्री को अधिलेखित कर दिया जाता है। यदि फ़ाइल मौजूद नहीं है, तो एक नई फ़ाइल बनाई जाती है। फ़ाइल खोलने में असमर्थ होने पर NULL लौटाता है।
संचालन संभव – नई सामग्री लिखना, उन्हें वापस पढ़ना और फ़ाइल की मौजूदा सामग्री को संशोधित करना।
“a+”फ़ाइल खोजता है। यदि फ़ाइल सफलतापूर्वक खोली जाती है तो fopen() इसे मेमोरी में लोड करता है और एक पॉइंटर सेट करता है जो इसमें पहले वर्ण को इंगित करता है। यदि फ़ाइल मौजूद नहीं है, तो एक नई फ़ाइल बनाई जाती है।
फ़ाइल खोलने में असमर्थ होने पर NULL लौटाएँ।
संचालन संभव – मौजूदा सामग्री को पढ़ना, फ़ाइल के अंत में नई सामग्री जोड़ना। मौजूदा सामग्री को संशोधित नहीं कर सकता।

ये भी पढ़े :-

String (Line) I/O in Files in c in hindi |Low-Level File i/o in c in hindi

Previous articleC++ Basic Input/Output in hindi | C++ Programming Basics in hindi
Next articleString (Line) I/O in Files in c in hindi |Low-Level File i/o in c in hindi

1 COMMENT

LEAVE A REPLY

Please enter your comment!
Please enter your name here