File Read और Write
पढ़ने-लिखने के चार तरीके
File खुलने के बाद (fopen/fclose के लिए देखें file handling basics), C data अंदर-बाहर करने के चार तरीके देता है। हर एक अलग रूप के data के लिए उपयुक्त है:
| स्तर | Write / Read | किसके लिए |
|---|---|---|
| Character | fputc / fgetc | एक बार में एक char |
| Line | fputs / fgets | Text lines |
| Formatted | fprintf / fscanf | मिश्रित values / records |
| Binary | fwrite / fread | Structs, arrays, कच्चा data |
Character I/O: fgetc और fputc
fputc एक character लिखता है; fgetc एक पढ़ता है, file के अंत पर EOF लौटाते हुए।
FILE *fp = fopen("data.txt", "w");
fputc('H', fp); fputc('i', fp); // do char likhein
fclose(fp);
fp = fopen("data.txt", "r");
int ch;
while ((ch = fgetc(fp)) != EOF) // ant tak padhein
putchar(ch);
fclose(fp);Hi
Line I/O: fgets और fputs
fputs एक string लिखता है; fgets एक line को fixed buffer में सुरक्षित पढ़ता है।
FILE *fp = fopen("note.txt", "w");
fputs("Hello file\n", fp);
fputs("Second line\n", fp);
fclose(fp);
fp = fopen("note.txt", "r");
char line[100];
while (fgets(line, sizeof(line), fp) != NULL)
printf("%s", line);
fclose(fp);Hello file
Second line
fgets buffer size लेता है, तो यह कभी आपके array के पार नहीं लिखता। पुराने असुरक्षित gets के बजाय इसे पसंद करें।
Formatted I/O: fscanf और fprintf
मिश्रित types वाले records (name, age, marks) के लिए, fprintf और fscanf printf/scanf जैसे काम करते हैं पर file पर।
FILE *fp = fopen("rec.txt", "w");
fprintf(fp, "%s %d\n", "Aman", 95); // record likhein
fclose(fp);
fp = fopen("rec.txt", "r");
char name[20]; int marks;
fscanf(fp, "%s %d", name, &marks); // wapas padhein
printf("%s scored %d\n", name, marks);
fclose(fp);Aman scored 95
Binary I/O: fread और fwrite
पूरे structure को ठीक वैसे store करने को जैसे वह memory में है, fwrite और fread के साथ binary mode इस्तेमाल करें।
struct Student { char name[20]; int marks; };
struct Student s = {"Ravi", 88};
FILE *fp = fopen("s.dat", "wb"); // wb = write binary
fwrite(&s, sizeof(s), 1, fp);
fclose(fp);
struct Student r;
fp = fopen("s.dat", "rb"); // rb = read binary
fread(&r, sizeof(r), 1, fp);
printf("%s %d\n", r.name, r.marks);
fclose(fp);Ravi 88
कौन सा तरीका इस्तेमाल करें?
- Character — files copy करना, characters गिनना, सरल filters।
- Line — text files line-by-line पढ़ना (logs, config)।
- Formatted — मिश्रित fields वाले पढ़ने योग्य records।
- Binary — structs/arrays तेज़ और compact सहेजना, पढ़ने के लिए नहीं।
आम गलतियाँ
fgetcकोintके बजायcharसे तुलना करना — EOF को int चाहिए।- Binary data के लिए text mode या उल्टा इस्तेमाल करना।
- जो struct layout लिखा उससे अलग layout से पढ़ना (binary files layouts में portable नहीं)।
- Read/write की return value errors के लिए जाँचना भूलना।
fprintf से तीन student records लिखें, फिर fscanf से loop में सब वापस पढ़ें जब तक वह matches लौटाना बंद न करे। फिर वही fwrite/fread से करें और file sizes की तुलना करें।
सारांश
- C के चार I/O स्तर: character, line, formatted और binary।
fgetc/fputcएकल characters संभालते हैं;EOFतक loop करें।fgets/fputslines सुरक्षित संभालते हैं।fprintf/fscanfपढ़ने योग्य records;fwrite/freadकच्चा binary।- वह स्तर चुनें जो आपके data और पढ़ने-योग्यता की ज़रूरत से मेल खाए।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में files पढ़ने-लिखने के अलग-अलग तरीके क्या हैं?
fgetc/fputc से, एक-एक line fgets/fputs से, formatted values fscanf/fprintf से, और कच्चे binary blocks fread/fwrite से। आप वही चुनते हैं जो आपके data के रूप से मेल खाए।fprintf और fwrite में क्या अंतर है?
fprintf पढ़ने योग्य text लिखता है — numbers "42" जैसे characters बनते हैं — तो file किसी भी editor में खुल सकती है। fwrite data के कच्चे bytes वैसे ही लिखता है जैसे वे memory में हैं, जो compact और तेज़ है पर text के रूप में पढ़ने योग्य नहीं। Text files के लिए fprintf, binary के लिए fwrite।C में fgets क्या करता है?
fgets file से एक line को character array में पढ़ता है, newline पर या buffer भरने पर रुकते हुए, और newline character रखता है। यह पुराने functions से सुरक्षित है क्योंकि आप अधिकतम size बताते हैं, तो यह buffer overflow नहीं करेगा।मुझे fprintf के बजाय fread और fwrite कब इस्तेमाल करने चाहिए?
fread/fwrite तब इस्तेमाल करें जब पूरे structures या arrays जैसा data ठीक वैसे ही store करना हो जैसे वह memory में है — यह text से तेज़ और छोटा है। fprintf/fscanf तब जब file पढ़ने योग्य हो या दूसरे programs से साझा हो।C में पूरी file character-by-character कैसे पढ़ें?
fgetc को loop में call करते हैं और तब रुकते हैं जब वह विशेष value EOF लौटाए, जो file का अंत दर्शाता है। हर call अगला character लौटाता है, तो loop पूरी file में एक-एक character चलता है।