अध्याय 13: फाइल हैंडलिंग (File Handling)

अध्याय 13: फाइल हैंडलिंग (File Handling)

फाइल हैंडलिंग C प्रोग्रामिंग में एक महत्वपूर्ण पहलू है, जो हमें डेटा को फाइलों में संग्रहीत और प्रबंधित करने की अनुमति देता है। फाइल हैंडलिंग के माध्यम से, हम डेटा को स्थायी रूप से संग्रहित कर सकते हैं, उसे पढ़ सकते हैं, और आवश्यकता पड़ने पर संशोधित कर सकते हैं। फाइल हैंडलिंग में फाइलों को खोलना, पढ़ना, लिखना, और बंद करना शामिल होता है। C प्रोग्रामिंग में फाइल हैंडलिंग के लिए stdio.h हेडर फाइल में कई फंक्शन्स उपलब्ध हैं, जो इन ऑपरेशन्स को आसान बनाते हैं। इस अध्याय में, हम फाइल हैंडलिंग की बुनियादी अवधारणाओं, फाइल ऑपरेशन्स, और विभिन्न फाइल मोड्स के बारे में विस्तार से जानेंगे।

फाइल्स का परिचय (Introduction to Files)

फाइल्स कंप्यूटर सिस्टम में डेटा को स्थायी रूप से संग्रहित करने का एक माध्यम हैं। फाइल्स का उपयोग डेटा को प्रोग्राम से बाहर सुरक्षित रखने, बड़े डेटा सेट्स को प्रबंधित करने, और प्रोग्राम्स के बीच डेटा साझा करने के लिए किया जाता है। C प्रोग्रामिंग में, फाइल्स के साथ काम करने के लिए कई इनबिल्ट फंक्शन्स उपलब्ध हैं जो फाइल्स को खोलने, पढ़ने, लिखने और बंद करने में मदद करते हैं।

फाइल प्रकार (Types of Files)

C प्रोग्रामिंग में, मुख्य रूप से दो प्रकार की फाइल्स होती हैं:

  • टेक्स्ट फाइल्स (Text Files): इनमें सामान्य टेक्स्ट डेटा होता है और यह पढ़ने और लिखने में आसान होती हैं। इन फाइल्स में डेटा को मानव पढ़ सकता है।
  • बाइनरी फाइल्स (Binary Files): इनमें डेटा बाइनरी फॉर्मेट में संग्रहीत होता है और इसे मानव द्वारा पढ़ा नहीं जा सकता। यह फाइल्स अधिक कुशल और कॉम्पैक्ट होती हैं।

फाइल ऑपरेशन्स (File Operations)

C में फाइल हैंडलिंग के लिए मुख्य रूप से निम्नलिखित ऑपरेशन्स किए जाते हैं:

  • फाइल खोलना (Opening a File): फाइल को पढ़ने, लिखने या जोड़ने (append) के लिए खोलना।
  • फाइल पढ़ना (Reading a File): फाइल से डेटा को पढ़ना।
  • फाइल लिखना (Writing a File): फाइल में डेटा लिखना।
  • फाइल बंद करना (Closing a File): फाइल ऑपरेशन्स समाप्त होने पर फाइल को बंद करना।

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

फाइल को खोलने के लिए fopen फंक्शन का उपयोग किया जाता है। इसका सिंटैक्स निम्नलिखित है:

FILE *fopen(const char *filename, const char *mode);

  • filename: यह उस फाइल का नाम है जिसे आप खोलना चाहते हैं।
  • mode: यह फाइल को खोलने का तरीका निर्दिष्ट करता है, जैसे कि पढ़ने के लिए (“r”), लिखने के लिए (“w”), या जोड़ने के लिए (“a”)।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // फाइल ऑपरेशन्स यहाँ

    fclose(file);
    return 0;
}

फाइल मोड्स (File Modes)

फाइल को खोलने के विभिन्न मोड्स होते हैं, जिनमें से कुछ सामान्य मोड्स निम्नलिखित हैं:

  • “r”: फाइल को पढ़ने के लिए खोलना। फाइल को पहले से मौजूद होना चाहिए।
  • “w”: फाइल को लिखने के लिए खोलना। यदि फाइल पहले से मौजूद है, तो इसकी सामग्री को हटा दिया जाएगा।
  • “a”: फाइल को जोड़ने (append) के लिए खोलना। यदि फाइल पहले से मौजूद नहीं है, तो एक नई फाइल बनाई जाएगी।
  • “r+”: फाइल को पढ़ने और लिखने के लिए खोलना। फाइल को पहले से मौजूद होना चाहिए।
  • “w+”: फाइल को पढ़ने और लिखने के लिए खोलना। यदि फाइल पहले से मौजूद है, तो इसकी सामग्री को हटा दिया जाएगा।
  • “a+”: फाइल को पढ़ने और जोड़ने (append) के लिए खोलना। यदि फाइल पहले से मौजूद नहीं है, तो एक नई फाइल बनाई जाएगी।

फाइल्स के साथ पढ़ना और लिखना (Reading and Writing with Files)

C प्रोग्रामिंग में, फाइल्स के साथ पढ़ने और लिखने के लिए विभिन्न फंक्शन्स उपलब्ध हैं। इन फंक्शन्स का उपयोग करके हम फाइल्स से डेटा पढ़ सकते हैं और फाइल्स में डेटा लिख सकते हैं। इस खंड में, हम fread और fwrite फंक्शन्स के साथ-साथ fgets और fputs फंक्शन्स का उपयोग करना सीखेंगे।

फाइल्स से डेटा पढ़ना (Reading Data from Files)

फाइल्स से डेटा पढ़ने के लिए मुख्य रूप से fgets और fread फंक्शन्स का उपयोग किया जाता है।

fgets फ़ंक्शन:

fgets फ़ंक्शन का उपयोग टेक्स्ट फाइल्स से डेटा पढ़ने के लिए किया जाता है। यह एक लाइन को पढ़ता है और इसे एक स्ट्रिंग में संग्रहीत करता है।

char *fgets(char *str, int n, FILE *stream);

  • str: यह उस स्ट्रिंग का पॉइंटर है जिसमें डेटा पढ़ा जाएगा।
  • n: यह अधिकतम संख्या है जो पढ़ी जा सकती है।
  • stream: यह फाइल पॉइंटर है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    char line[100];

file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line);
    }

    fclose(file);
    return 0;
}

fread फ़ंक्शन:

fread फ़ंक्शन का उपयोग बाइनरी फाइल्स से डेटा पढ़ने के लिए किया जाता है।

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

  • ptr: यह उस बफर का पॉइंटर है जिसमें डेटा पढ़ा जाएगा।
  • size: प्रत्येक तत्व का आकार।
  • nmemb: पढ़ने के लिए तत्वों की संख्या।
  • stream: यह फाइल पॉइंटर है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    int numbers[5];

    file = fopen("numbers.bin", "rb");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fread(numbers, sizeof(int), 5, file);

    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }

    fclose(file);
    return 0;
}

फाइल्स में डेटा लिखना (Writing Data to Files)

फाइल्स में डेटा लिखने के लिए मुख्य रूप से fputs और fwrite फंक्शन्स का उपयोग किया जाता है।

fputs फ़ंक्शन:

fputs फ़ंक्शन का उपयोग टेक्स्ट फाइल्स में डेटा लिखने के लिए किया जाता है।

int fputs(const char *str, FILE *stream);

  • str: यह उस स्ट्रिंग का पॉइंटर है जिसे फाइल में लिखा जाएगा।
  • stream: यह फाइल पॉइंटर है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fputs("Hello, World!\n", file);

    fclose(file);
    return 0;
}

fwrite फ़ंक्शन:

fwrite फ़ंक्शन का उपयोग बाइनरी फाइल्स में डेटा लिखने के लिए किया जाता है।

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

  • ptr: यह उस डेटा का पॉइंटर है जिसे फाइल में लिखा जाएगा।
  • size: प्रत्येक तत्व का आकार।
  • nmemb: लिखने के लिए तत्वों की संख्या।
  • stream: यह फाइल पॉइंटर है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    int numbers[5] = {10, 20, 30, 40, 50};

    file = fopen("numbers.bin", "wb");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fwrite(numbers, sizeof(int), 5, file);

    fclose(file);
    return 0;
}

फाइल ऑपरेशन्स (File Operations)

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

फाइल को पुनः खोलना (Reopening a File)

कभी-कभी हमें फाइल को पढ़ने या लिखने के लिए पुनः खोलने की आवश्यकता होती है। इसके लिए हम फाइल को पहले बंद करते हैं और फिर आवश्यक मोड में पुनः खोलते हैं।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;

    // फाइल को लिखने के लिए खोलना
    file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("Error opening file for writing!\n");
        return 1;
    }
    fputs("Hello, World!\n", file);
    fclose(file);

    // फाइल को पढ़ने के लिए पुनः खोलना
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file for reading!\n");
        return 1;
    }
    char line[100];
    fgets(line, sizeof(line), file);
    printf("Read from file: %s", line);
    fclose(file);

    return 0;
}

फाइल पोजिशनिंग (File Positioning)

फाइल पोजिशनिंग का उपयोग फाइल के भीतर पढ़ने या लिखने की स्थिति को बदलने के लिए किया जाता है। इसके लिए fseek, ftell, और rewind फंक्शन्स का उपयोग किया जाता है।

fseek फ़ंक्शन:

int fseek(FILE *stream, long int offset, int whence);

  • stream: यह फाइल पॉइंटर है।
  • offset: यह पोजिशन को बदलने के लिए बाइट्स की संख्या है।
  • whence: यह संदर्भ बिंदु है, जैसे SEEK_SET, SEEK_CUR, और SEEK_END।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // फाइल पोजिशनिंग
    fseek(file, 6, SEEK_SET);
    char ch = fgetc(file);
    printf("Character at position 6: %c\n", ch);

    fclose(file);
    return 0;
}

ftell फ़ंक्शन:

long int ftell(FILE *stream);

  • stream: यह फाइल पॉइंटर है।
  • यह वर्तमान पोजिशन को रिटर्न करता है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // फाइल पोजिशनिंग
    fseek(file, 6, SEEK_SET);
    long pos = ftell(file);
    printf("Current position: %ld\n", pos);

    fclose(file);
    return 0;
}

rewind फ़ंक्शन:

void rewind(FILE *stream);

  • stream: यह फाइल पॉइंटर है।
  • यह फाइल पोजिशन को शुरुआत में सेट करता है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // फाइल पोजिशनिंग
    fseek(file, 6, SEEK_SET);
    rewind(file);
    long pos = ftell(file);
    printf("Position after rewind: %ld\n", pos);

    fclose(file);
    return 0;
}

फाइल एरर हैंडलिंग (File Error Handling)

फाइल ऑपरेशन्स के दौरान संभावित एरर्स को संभालना महत्वपूर्ण होता है। इसके लिए ferror, feof, और clearerr फंक्शन्स का उपयोग किया जाता है।

ferror फ़ंक्शन:

int ferror(FILE *stream);

  • stream: यह फाइल पॉइंटर है।
  • यह फाइल ऑपरेशन्स के दौरान होने वाले एरर्स की जांच करता है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // एरर उत्पन्न करने का प्रयास
    fgetc(file);
    if (ferror(file)) {
        printf("Error reading from file!\n");
    }

    fclose(file);
    return 0;
}

feof फ़ंक्शन:

int feof(FILE *stream);

  • stream: यह फाइल पॉइंटर है।
  • यह फाइल के अंत तक पहुंचने की जांच करता है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // फाइल से पढ़ना
    while (!feof(file)) {
        char ch = fgetc(file);
        if (!feof(file)) {
            printf("%c", ch);
        }
    }

    fclose(file);
    return 0;
}

clearerr फ़ंक्शन:

void clearerr(FILE *stream);

  • stream: यह फाइल पॉइंटर है।
  • यह फाइल पॉइंटर के एरर और एंड-ऑफ-फाइल इंडिकेटर्स को रिसेट करता है।

उदाहरण:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // एरर उत्पन्न करने का प्रयास
    fgetc(file);
    if (ferror(file)) {
        printf("Error reading from file!\n");
    }

    // एरर को क्लियर करना
    clearerr(file);
    if (!ferror(file)) {
        printf("Error cleared successfully!\n");
    }

    fclose(file);
    return 0;
}



Index