इस tutorial में हम file handling के basics के बारे में बात करेंगे और सीखेंगे की कैसे आप C programming में files open कर सकते हो, files में data read और write कर सकते हो.
इस tutorial की शुरुआत करने से पहले मैं आपको एक बात clear करना चाहूँगा की ये tutorial नए programmers को ध्यान में रखकर लिखा गया है.
इसलिए हम इस tutorial में file handling को अच्छे से समझने के लिए हम programming definition की बजाय आसान शब्दों का उपयोग करेंगे.
अभी तक C programming में हमने data को store करने के लिए variables, arrays और structures का use किया है.
लेकिन इन सबके साथ एक problem है और वो ये है की ये और इनका data memory में सिर्फ तब तक store रहते हैं जब तक हमारा program चल रहा है.
जैसे ही program close होगा वैसे ही program में मौजूद सभी variables, arrays और structures और उनका data memory से हट जाएगा.
इसे हम ऐसे भी बोल सकते हैं की variables, arrays और structures में data सिर्फ कुछ समय के लिए यानी temporary तौर पर ही store होता है.
लेकिन कभी-कभी हम ऐसा चाहते हैं की user से जो data input ले रहे हैं या वो data जो हम अपने program से generate कर रहे हैं उस data को computer memory में permanently store कर सकें.
C programming में data को permanently store करने के लिए हम ज्यादातर text files का use करते हैं और इस process को समझने के लिए आपको file handling को समझना होगा.
C Programming में File Handing कैसे करते हैं?
किसी भी C program में process होने वाले जरूरी data को file में store करने के लिए file को create या open करना, file में data update, read और write करने के process को हम file handling कहते हैं.
Data को files में store करने का ये फायदा होता है की C program के terminate हो जाने के बाद जब भी हम दोबारा program run करेंगे तब हम file में stored data को अपने program में use कर सकते हैं और आसानी से data को एक computer से दूसरे computer में ले जा सकते हो.
Types of Files
C programming में हम 2 तरह की files create करते हैं पहली text files और दूसरी binary files. Text files का extension .txt होता है और binary files का extension .bin होता है.
Text files का contents आप किसी भी text editor जैसे की Notepad में open करके आसानी से read कर सकते हो क्योंकि text files में contents plain text के तौर पर store होता है.
Binary files में contents binary form (0 और 1) में ही store होता है इसलिए आप binary files को open करके उसका contents पढ़ नहीं सकते हो.
लेकिन Binary files text files से ज्यादा contents store कर सकती हैं और ये memory में spcae भी कम occupied करती हैं और binary files में data store करना ज्यादा secure भी माना जाता है.
इस tutorial में हम सिर्फ text files के साथ काम करेंगे क्योंकि नए programmers के लिए text files के साथ file handling करना आसान होता है.
C File Handling Operations
जैसा की मैंने इस tutorial के शुरुआत में ही बता दिया था की इस tutorial में हम C file handling का सिर्फ basics cover करेंगे इसलिए हम सिर्फ नीचे दिए गए file handing operations को ही सीखेंगे.
- New file create करना.
- पहले से मौजूद file को open करना.
- File से data read करना.
- File में data write करना.
- File close करना.
ऊपर जो हमने file handling operations की list दी है उनको perform करने के लिए C programming में stdio.h header file के अंदर बहुत सारे built-in functions दिए गए हैं.
इन function की help से C programming में file handling करना बहुत आसान हो जाता है. हम नीचे इन सभी functions को example program के साथ use करेंगे.
File Pointer in C
अगर मैं यहाँ आपको File pointer की technical definition बताऊं तो हो सकता है की शायद आपको कुछ समझ ना आए या आप थोड़ा confuse हो जाओ इसलिए मैं आपको अपने शब्दों में file pointer की definition बताऊंगा.
जैसा की हमने pointer tutorial में पढ़ा था की int data type का pointer सिर्फ int data type के variables के address point कर सकता है.
इसी तरह computer में मौजूद किसी file को access करने के लिए या मैं कहूँ की file के address को point करने के लिए हम FILE type का pointer declare करते हैं.
अपने C programs में सभी file handling operations करने के लिए हम file pointer का ही use करते हैं.
File pointer declaration:
FILE *ptr;
File pointer declaration ठीक वैसे ही जैसे आप अभी तक int, float या अन्य data type के pointer declare करते आये हो.
बस इस बात का विशेष ध्यान रखिएगा की FILE शब्द को आपको पूरा uppercase (capital) में ही लिखना है. Pointer का identifier आप कुछ भी रख सकते हो जैसे हमने ptr रखा है.
C Programming में File Open या Create कैसे करते है?
C programs में file open करने के लिए या new file create करने के लिए हम fopen() function का use करते हैं.
fopen() function आपके लिए दोनों काम कर देता है यानी जिस file को आप open करना चाहते हो अगर वो file आपके computer में पहले से मौजूद नहीं हैं तो fopen() function उस file को create कर देगा.
fopen() function syntax:
FILE * fopen("File Name","Mode");
जैसा की आप ऊपर syntax में देख सकते हो की fopen() function में हम 2 arguments pass करते हैं.
अगर आप अपनी file उसी जगह (folder) से open या create करना चाहते हो जहाँ पहले से ही आपका C program save है तब आप fopen() function के पहले argument में सिर्फ उस file का नाम बताते हैं.
अगर आप अपनी file अपने C program वाली जगह की बजाय किसी दूसरी location पर create या open करना चाहते हो तब आप fopen() function के पहले argument में उस file name के साथ उस location का path भी बताते हैं.
fopen() function example:
fopen("Books.txt","Mode"); fopen("D:/foldername/Books.txt","Mode");
File opening modes in C Programming
अब हम बात करते हैं fopen() function के second argument की जहाँ पर हम बताते हैं की file को access करने का mode.
Mode की help से compiler को ये पता चलता है की आप file को किस operation के लिए open या create कर रहे हो जैसे की data read करने के लिए, data write करने के लिए या data append करने के लिए.
C programming में बहुत सारे file open करने के modes होते हैं. मैंने नीचे कुछ important (basic) modes के बारे में बताया है जिन्हें हम इस tutorial में use करेंगे.
“r” – इसे हम read mode कहते हैं. जब हम file में से data read करने के लिए उसे open करते हैं तब हम read mode (“r”) का use करते हैं.
अगर आप जिस file को open कर रहे हैं वो file पहले से मौजूद नहीं है तो fopen() function NULL return करता है यानी read mode में fopen() function file को create नहीं करता है.
Read mode (“r”) example:
fopen("FileName.txt","r");
“w” – इसे हम write mode कहते हैं. जब हम file में data write करने के लिए उसे open करते हैं तब हम write mode (“w”) का use करते हैं.
अगर आप जिस file को write mode में open कर रहे हैं वो file पहले से मौजूद नहीं है तो fopen function उस name से new file को create कर देगा.
अगर आप ऐसी file को write mode में open करते हैं जिसमें पहले से कोई contents (data) हो तो ये write mode उस data को overwritten कर देता है.
File overwritten का ये मतलब है की उस file में पहले से मौजूद उस data को हटा दिया जाता है और आप जो new data enter करेंगे उसे write कर दिया जाता है.
Write mode (“w”) example:
fopen("FileName.txt","w");
“a” – इसे हम Append mode कहते हैं. ये mode बिल्कुल write mode (“w”) की तरह ही होता है बस इनमें एक फर्क ये होता है की ये mode file में data को append कर देता है.
Data append का ये मतलब है की file में पहले से मौजूद data भी रहेगा और उसके बाद new enter data भी file में write (append) कर दिया जाएगा.
Append mode (“a”) example:
fopen("FileName.txt","a");
“r+” – ये mode बिल्कुल read mode (“r”) की तरह ही होता है बस फर्क ये ही की ये read के साथ-साथ data write भी कर सकता है.
“w+” – ये mode बिल्कुल write mode (“w”) की तरह ही होता है बस फर्क ये ही की ये write के साथ-साथ data read भी कर सकता है.
“a+” – ये mode बिल्कुल append mode (“a”) की तरह ही होता है बस फर्क ये ही की ये write के साथ-साथ data read भी कर सकता है.
fopen() function return value:
मैं technical details में ना जाकर अगर आसान शब्दों में कहूँ तो fopen() function file create या open करने के बाद उस file का address return करता है जिसे हमें FILE type के pointer में assign कर देते है.
अगर किसी reason की वजह से file open या create नहीं होती है तब fopen function NULL value return करता है.
File successfully create या open हो जाने के बाद हम file pointer की help से ही file में data read या write करते हैं
fopen function examples:
FILE *ptr, *ktr; ptr=fopen("Books.txt","r"); ktr=fopen("D:/foldername/Records.txt","w");
C Programming में File Close कैसे करते है?
किसी भी तरह के file handling operation के लिए जब आप file open करते हो तब काम पूरा हो जाने के बाद ये बहुत जरूरी होता है की आप उस file को fclose() function की help से close कर दें.
fclose() function syntax:
fclose(file_pointer);
हम जिस file को close करना चाहते हैं उस file के pointer को हम fclose() function में argument के तौर pass कर देते हैं.
C Programming में File में Data Write कैसे करते है?
C programming में files में data write करने के लिए हमारे पास बहुत सारे built-in functions का support होता है.
आपको कब और कौन सा function use करना चाहिए ये इस बात पर depend करता है की आप किस type का data और किस format में file में write करना चाहते हो.
Write Data in File using fputc() and putc() functions
fputc() function और putc() function दोनों का syntax और use एक ही है. दोनों functions की help से single character को file में write किया जाता है.
putc() function syntax:
putc(char_value, file_pointer);
fputc() function syntax:
fputc(char_value, file_pointer);
fputc() function example program:
#include <stdio.h>
int main()
{
char ch;
FILE *ptr;
ptr=fopen("Demo.txt","w");
if(ptr==NULL)
{
printf("File is not opened or created");
}
else
{
printf("Enter Single Character : ");
scanf("%c",&ch);
fputc(ch,ptr);
fclose(ptr);
}
return 0;
}
Output:
Enter Single Character : H
putc() function से single character write करने के लिए ऊपर program में line 18 पर fputc() function की जगह सिर्फ putc() function लिख दीजिएगा.
ऊपर program से Demo.txt file आपके computer में उसी जगह create होगी जहाँ पर आपका program save होगा.
अगर आप Demo.txt file open करके देखेंगे तो आपको उसमें वो single character भी लिखा नजर आएगा जो आपके program से write किया होगा जैसे हमने character H को write किया है.
Write Data in File using fputs() function
अगर आप single character की बजाय पूरी string file में write करना चाहते हो तो उसके लिए हम fputs() function का use करते हैं.
fputs() function syntax:
fputs(string_value, file_pointer);
fputs() function example program:
#include <stdio.h>
int main()
{
char name[20];
FILE *ptr;
ptr=fopen("Demo.txt","w");
if(ptr==NULL)
{
printf("File is not opened or created");
}
else
{
printf("Enter Your Name : ");
scanf("%s",name);
fputs(name,ptr);
fclose(ptr);
}
return 0;
}
Output:
Enter Your Name : Rohit
Write Data in File using fprintf() function
fprintf() function लगभग printf() function की तरह होता है. जैसे हम printf() function से console (screen) पर formatted data print करते हैं.
ठीक ऐसे ही fprint() function से अलग-अलग data types के variables को एक particular format में file में write करते हैं.
fprintf() function syntax:
fprintf(file_pointer, "format-specifiers", variables);
fprintf() function example program 1:
#include <stdio.h>
int main()
{
char name[20];
int roll;
float cgpa;
FILE *ptr;
ptr=fopen("Demo.txt","w");
if(ptr==NULL)
{
printf("File is not opened or created");
}
else
{
printf("Enter Student Roll No. : ");
scanf("%d",&roll);
printf("Enter Student Name : ");
scanf("%s",name);
printf("Enter Student CGPA : ");
scanf("%f",&cgpa);
fprintf(ptr,"Roll : %d, Name : %s, CGPA : %f",roll,name,cgpa);
fclose(ptr);
}
return 0;
}
Output:
Enter Student Roll No. : 15 Enter Student Name : Rohit Enter Student CGPA : 8.9
File Output:
fprintf() function example program 2:
#include <stdio.h>
int main()
{
char name[20];
int roll,i,n;
float cgpa;
FILE *ptr;
ptr=fopen("Demo.txt","w");
if(ptr==NULL)
{
printf("File is not opened or created");
}
else
{
printf("Enter no. of Students : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("\nEnter Student Roll No. : ");
scanf("%d",&roll);
printf("Enter Student Name : ");
scanf("%s",name);
printf("Enter Student CGPA : ");
scanf("%f",&cgpa);
fprintf(ptr,"%d %s %f\n",roll,name,cgpa);
}
fclose(ptr);
}
return 0;
}
Output:
Enter no. of Students : 3 Enter Student Roll No. : 101 Enter Student Name : Aman Enter Student CGPA : 8.9 Enter Student Roll No. : 102 Enter Student Name : Rohit Enter Student CGPA : 9.4 Enter Student Roll No. : 103 Enter Student Name : Rajeev Enter Student CGPA : 8.5
File Output:
Note: ऊपर हमने सभी programs में file में data write करने के लिए file को write mode (“w”) में open किया है और ये mode नया data write करने से पहले पुराने data को हटा देता है.
अगर आप चाहते हो की जब आप file में data write करने के लिए आपने C program को run करें और वो program आपकी file के पुराने data को overwrite ना करे तो आप file को append mode (“a”) में open करें.
EOF and feof() function in File Handling
File में data write करना तो हम सीख लिया है और अब हम file से data read करना सीखेंगे लेकिन उससे पहले आपको EOF constant और feof() function की जानकारी होना जरूरी है.
File से data read करने के लिए हम जो भी functions use करेंगे वो सब file से data या तो character by character read करेंगे या line by line.
अब क्योंकि हमें ये पता ही नहीं होता है की file में कितना data है इसलिए इस तरह से data read करने में problem ये आती है की हमें पता ही नहीं होता है की data read करने वाले statements को कितनी बार चलाना है.
File से data read करने वाले functions को हम ज्यादातर while loop के साथ use करते हैं और इसलिए हमें loop में condition इस तरह से लगानी होती है की जैसे ही file का सारा data read हो जाए तब loop की condition false हो जाए.
C programming में file से data read करने की इस problem का जो सबसे आसान solution है वो है EOF constant.
जैसे जब हम string में input लेते हैं तब string के end में अपने आप ‘\0’ add हो जाता है ठीक ऐसे ही जब हम file में data write करते हैं तब file के end में अपने आप EOF constant add हो जाता है.
इसका फायदा ये होता है की file से data read करने वाले loop में हम ये condition लगा देते हैं की जैसे ही file में EOF constant मिल जाए वैसे ही loop stop हो जाए.
feof() function का use भी ये पता लगाने के लिए ही होता है की file से data read करते वक्त क्या file pointer file के end तक यानी EOF constant तक पहुँच गया या नहीं.
जैसे ही feof() function को file में EOF constant मिल जाता है ये function कोई भी non-zero value (true) return करता है और अगर इसे EOF constant नहीं मिलता तो ये zero (false) return करता है.
feof() function syntax:
int feof(file_pointer);
C Programming में File से Data Read कैसे करते है?
C programming में files में data read करने के लिए भी हमारे पास बहुत सारे built-in functions का support होता है.
आपको कब और कौन सा function use करना चाहिए ये इस बात पर depend करता है की आप किस type का data file से read करना चाहते हो.
Read Data from File using fgetc() and getc() functions
fgetc() function और getc() function दोनों का syntax और use एक ही है. दोनों functions की help से हम file में से single character को read करते हैं.
जब हम इन दोनों में से किसी भी function से file में से data read करते हैं तब वो function उस file में से single character को read करके return करता है और file pointer को अगले character पर move कर देता है.
अगर आप फिर से उस function से file से data read करते हैं तब वो character return होगा जिसपर file pointer move हुआ था और इसी तरह से आप बार-बार function call करके file से एक-एक character read करके सारा data read कर सकते हो.
File read करते वक्त अगर कोई error आ जाए या file pointer EOF (end of file) तक पहुँच जाए तब ये functions EOF (-1) return करते हैं.
getc() function syntax:
char getc(file_pointer);
fgetc() function syntax:
char fgetc(file_pointer);
getc() function example program:
ऊपर हमने fprintf() function के example program 2 में जो data file में write किया था. नीचे दिए गए file data read करने वाले सभी example programs में हम उसी file से data read करेंगे.
#include <stdio.h>
int main()
{
char ch;
FILE *ptr;
ptr=fopen("Demo.txt","r");
if(ptr==NULL)
{
printf("File is not opened");
}
else
{
while(!feof(ptr))
{
ch=getc(ptr);
printf("%c",ch);
}
fclose(ptr);
}
return 0;
}
Output:
101 Rohit 9.700000 102 Amit 8.900000 103 Karan 9.300000
Explanation:
ऊपर program में हमने while loop की condition में feof() function की help से ये check किया की क्या file pointer EOF (end of file) तक पहुँच गया है नहीं.
हमने condition के साथ logical NOT operator ( ! ) का use इसलिए किया है क्योंकि feof() function true करेगा तब तक false return करेगा जब तक उसे EOF नहीं मिल जाता है.
Condition के साथ logical NOT operator से लगाने से ये होगा की जब तक feof() function को EOF नहीं मिलता तब condition false की जगह true रहेगी.
Condition true हो जाने के बाद हमने loop के अंदर अगर getc() function की help से single character read करके उसे variable ch में assign कर दिया है जिसे हमने साथ-साथ print भी करा दिया है.
getc() function जब single character read कर लेगा तब file pointer अगले character पर move हो जाएगा और फिर से while condition check होगी और इसी तरह program चलता रहेगा.
fgetc() function example program:
#include <stdio.h>
int main()
{
char ch;
FILE *ptr;
ptr=fopen("Demo.txt","r");
if(ptr==NULL)
{
printf("File is not opened");
}
else
{
while((ch=fgetc(ptr))!=EOF)
{
printf("%c",ch);
}
fclose(ptr);
}
return 0;
}
Output:
101 Rohit 9.700000 102 Amit 8.900000 103 Karan 9.300000
Explanation:
ऊपर program में हमने while loop की condition वाली जगह पर ही fgetc() function की help से single character को read करके variable ch में assign कराया है और साथ ही साथ ये condition भी check कर ली है की variable ch की value EOF के बराबर तो नहीं है.
अगर इस variable ch की value EOF के बराबर नहीं होगी तो condition true हो जाएगी और while के अंदर variable ch की value print हो जाएगी और program का control फिर से while condition पर चला जाएगा.
fgetc() function फिर से अगले single character read करके variable ch में assign कर देगा और फिर से condition check और program इसी तरह तब तक चलता रहेगा जब तक file के end से EOF read होकर variable ch में assign नहीं हो जाता है.
जब EOF file से read होकर variable ch में आएगा तब condition false हो जाएगी क्योंकि condition होगी (EOF != EOF).
Read Data from File using fscanf() function
हमने fprintf() function के example program 2 में जो data file में write किया था उसका format ये था int_value string_value float_value.
अब अगर आपको ये पहले से पता है की file में data किस format में मौजूद है तब fscanf() function से data read करना सबसे अच्छा option होता है.
fscanf() function लगभग scanf() function की तरह होता है. जैसे हम scanf() function से अलग-अलग variables में particular format में input लेते हैं.
ठीक ऐसे ही fscanf() function से अलग-अलग data types के variables में एक particular format में file से data read कर सकते हैं.
fscanf() function भी file के end पर पहुँच जाने पर EOF return करता है.
fscanf() function syntax:
fscanf(file_pointer, "format-specifiers", &variables);
fscanf() function example program:
#include <stdio.h>
int main()
{
char name[20];
int roll,i,n;
float cgpa;
FILE *ptr;
ptr=fopen("Demo.txt","r");
if(ptr==NULL)
{
printf("File is not opened");
}
else
{
while(!feof(ptr))
{
fscanf(ptr,"%d%s%f",&roll,name,&cgpa);
printf("Roll : %d, Name : %s, CGPA : %f\n",roll,name,cgpa);
}
fclose(ptr);
}
return 0;
}
Output:
Roll : 101, Name : Aman, CGPA : 8.900000 Roll : 102, Name : Rohit, CGPA : 9.400000 Roll : 103, Name : Rajeev, CGPA : 8.500000
What’s Next: मैं जल्दी ही C File Handling पर एक advanced tutorial post करूँगा. जिसमें हम file handling के background process और advanced options को detailed में समझेंगे.