C-Dateien-E/A: Erstellen, Öffnen, Lesen, Schreiben und Schließen einer Datei

⚡ Intelligente Zusammenfassung

Die Dateiverarbeitung in C speichert persistente Daten auf der Festplatte mithilfe der stdio-Bibliothek, die eine Datei mit fopen öffnet, mit fputc, fputs oder fprintf schreibt, mit fgetc, fgets oder fscanf liest und mit fclose schließt.

  • 📁 Dateimodi: Die an fopen übergebene Moduszeichenfolge — r, w, a, r+, w+ oder a+ — entscheidet darüber, ob eine Datei gelesen, überschrieben oder angehängt wird.
  • ✍️ Daten schreiben: fputc schreibt ein einzelnes Zeichen, fputs schreibt eine Zeichenkette und fprintf schreibt formatierten Text in den Dateizeiger.
  • ???? Lesedaten: fgetc liest ein Zeichen, fgets liest eine Zeile in einen Puffer ein und fscanf analysiert formatierte Token aus der Datei.
  • 🔒 Dateien werden geschlossen: fclose leert die zwischengespeicherten Daten und gibt die Datei frei; bei Erfolg wird 0 und im Fehlerfall EOF zurückgegeben.
  • 🔁 Interaktive Ein-/Ausgabe: getc und putc verarbeiten jeweils ein einzelnes Zeichen, indem sie die Eingabe direkt in eine Datei schreiben und wieder ausgeben.
  • 🤖 KI-Unterstützung: GitHub Copilot und KI-Assistenten erstellen Gerüste für fopen-, fprintf- und fgets-Routinen und kennzeichnen fehlende NULL-Prüfungen oder nicht geschlossene Dateien.

C-Dateien-E/A

C Dateiverwaltung

Eine Datei kann zur Speicherung großer Mengen persistenter Daten verwendet werden. Wie viele andere Programmiersprachen bietet auch C folgende Dateiverwaltungsfunktionen. Funktionen,

  1. Erstellung einer Datei
  2. Öffnen einer Datei
  3. Eine Datei lesen
  4. In eine Datei schreiben
  5. Schließen einer Datei

Nachfolgend sind die wichtigsten Dateiverwaltungsfunktionen aufgeführt, die in C:

Funktion Zweck
fopen() Erstellen einer Datei oder Öffnen einer vorhandenen Datei
fclose() Schließen einer Datei
fprintf() Schreiben eines Datenblocks in eine Datei
fscanf () Blockdaten aus einer Datei lesen
getc () Liest ein einzelnes Zeichen aus einer Datei
putc () Schreibt ein einzelnes Zeichen in eine Datei
Erhalten w () Liest eine Ganzzahl aus einer Datei
putw () Schreiben einer Ganzzahl in eine Datei
fseek () Legt die Position eines Dateizeigers auf einen angegebenen Speicherort fest
ftell () Gibt die aktuelle Position eines Dateizeigers zurück
zurückspulen () Setzt den Dateizeiger am Anfang einer Datei

So erstellen Sie eine Datei

Wann immer Sie mit einer Datei arbeiten möchten, besteht der erste Schritt darin, eine Datei zu erstellen. Eine Datei ist nichts anderes als Speicherplatz in einem Speicher, in dem Daten gespeichert werden.

Um eine Datei in einem C-Programm zu erstellen, wird folgende Syntax verwendet:

FILE *fp;
fp = fopen ("file_name", "mode");

In der obigen Syntax ist die Datei eine Datenstruktur, die in der Standardbibliothek definiert ist.

fopen ist eine Standardfunktion, die zum Öffnen einer Datei verwendet wird.

  • Wenn die Datei nicht auf dem System vorhanden ist, wird sie erstellt und dann geöffnet.
  • Wenn eine Datei bereits auf dem System vorhanden ist, wird sie direkt mit dieser Funktion geöffnet.

fp ist eine Datei Zeiger die auf die Typdatei verweist.

Wenn Sie eine Datei öffnen oder erstellen, müssen Sie angeben, was Sie mit der Datei tun möchten. Eine Datei in der C-Programmierung kann zum Lesen/Schreiben erstellt oder geöffnet werden. Ein Modus wird verwendet, um anzugeben, ob Sie eine Datei für einen der unten angegebenen Zwecke öffnen möchten. Im Folgenden sind die verschiedenen Arten von Modi in der C-Programmierung aufgeführt, die beim Arbeiten mit einer Datei verwendet werden können.

Dateimodus Beschreibung
r Öffnen Sie eine Datei zum Lesen. Befindet sich eine Datei im Lesemodus, werden keine Daten gelöscht, wenn eine Datei bereits auf einem System vorhanden ist.
w Öffnen Sie eine Datei zum Schreiben. Wenn sich eine Datei im Schreibmodus befindet, wird eine neue Datei erstellt, wenn eine Datei überhaupt nicht existiert. Wenn eine Datei bereits auf einem System vorhanden ist, werden alle darin enthaltenen Daten gekürzt und die Datei zum Schreiben geöffnet.
a Öffnen Sie eine Datei im Anfügemodus. Wenn sich eine Datei im Anfügemodus befindet, wird sie geöffnet. Der Inhalt der Datei bleibt unverändert.
r+ von Anfang an zum Lesen und Schreiben geöffnet
w+ Zum Lesen und Schreiben geöffnet und eine Datei überschrieben
a+ Zum Lesen und Schreiben öffnen, an Datei anhängen

In der angegebenen Syntax werden der Dateiname und der Modus wie folgt angegeben: Streicher Daher müssen sie immer in doppelte Anführungszeichen gesetzt werden.

Beispielsweise:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Ausgang:

Die Datei wird in demselben Ordner erstellt, in dem Sie Ihren Code gespeichert haben.

Erstellen einer Datei in der Ausgabe eines C-Programms

Sie können den Pfad angeben, in dem Sie Ihre Datei erstellen möchten

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Erstellen Sie eine Datei mit einem angegebenen Pfad in C

So schließen Sie eine Datei

Man sollte eine Datei immer schließen, wenn die Vorgänge an der Datei abgeschlossen sind. Das bedeutet, dass der Inhalt und die Links zur Datei beendet werden. Dies verhindert eine versehentliche Beschädigung der Datei.

'C' stellt die Funktion fclose bereit, um Dateischließvorgänge durchzuführen. Die Syntax von fclose lautet wie folgt:

fclose (file_pointer);

Beispielsweise:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

Die Funktion `fclose` erwartet einen Dateizeiger als Argument. Die zugehörige Datei wird anschließend mit `fclose` geschlossen. Sie gibt 0 zurück, wenn das Schließen erfolgreich war, und EOF (Dateiende), falls beim Schließen ein Fehler aufgetreten ist.

Nach dem Schließen der Datei kann derselbe Dateizeiger auch mit anderen Dateien verwendet werden.

Bei der „C“-Programmierung werden Dateien automatisch geschlossen, wenn das Programm beendet wird. Das manuelle Schließen einer Datei durch Schreiben der Funktion „fclose“ ist eine gute Programmierpraxis.

In eine Datei schreiben

Wenn Sie in C in eine Datei schreiben, müssen die Zeilenumbruchzeichen „\n“ explizit hinzugefügt werden.

Die stdio-Bibliothek bietet die notwendigen Funktionen zum Schreiben in eine Datei:

  • fputc(char, file_pointer): Es schreibt ein Zeichen in die Datei, auf die file_pointer zeigt.
  • fputs(str, file_pointer): Es schreibt eine Zeichenkette in die Datei, auf die file_pointer zeigt.
  • fprintf(file_pointer, str, variable_lists): Diese Funktion schreibt einen String in die Datei, auf die file_pointer zeigt. Der String kann optional Formatbezeichner und eine Liste von Variablen (variable_lists) enthalten.

Das folgende Programm zeigt, wie das Schreiben in eine Datei durchgeführt wird:

fputc() Funktion:

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

Ausgang:

Ausgabe der Funktion fputc() in C

Das obige Programm schreibt ein einzelnes Zeichen in die Datei fputc_test.txt, bis es das Zeilenumbruchzeichen „\n“ erreicht, welches anzeigt, dass der Satz erfolgreich geschrieben wurde. Dabei wird jedes Zeichen des Arrays in die Datei geschrieben.

Der Inhalt der Datei fputc_test.txt wurde in C geschrieben.

  1. Im obigen Programm haben wir eine Datei namens fputc_test.txt im Schreibmodus erstellt und geöffnet und deklarieren unseren String, der in die Datei geschrieben wird.
  2. Wir führen mithilfe einer For-Schleife einen Schreibvorgang Zeichen für Zeichen durch und fügen jedes Zeichen in unsere Datei ein, bis das Zeichen „\n“ gefunden wird. Anschließend wird die Datei mithilfe der Funktion „fclose“ geschlossen.

fputs() Funktion:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

Ausgang:

Ausgabe der Funktion fputs() in C

Inhalt der Datei fputs_test.txt in C

  1. Im obigen Programm haben wir eine Datei namens fputs_test.txt erstellt und im Schreibmodus geöffnet.
  2. Nachdem wir mit der Funktion fputs() einen Schreibvorgang durchgeführt haben, indem wir drei verschiedene Zeichenketten geschrieben haben
  3. Anschließend wird die Datei mit der Funktion fclose geschlossen.

fprintf()Funktion:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

Ausgang:

Ausgabe der fprintf()-Funktion in C

Inhalt der Datei fprintf_test.txt in C

  1. Im obigen Programm haben wir eine Datei namens fprintf_test.txt erstellt und im Schreibmodus geöffnet.
  2. Nachdem ein Schreibvorgang mit der Funktion fprintf() durch Schreiben einer Zeichenfolge ausgeführt wurde, wird die Datei mit der Funktion fclose geschlossen.

Daten aus einer Datei lesen

Es gibt drei verschiedene Funktionen zum Lesen von Daten aus einer Datei

  • fgetc(Dateizeiger): Diese Funktion gibt das nächste Zeichen der Datei zurück, auf die der Dateizeiger zeigt. Sobald das Dateiende erreicht ist, wird EOF zurückgegeben.
  • fgets(buffer, n, file_pointer): Es liest n-1 Zeichen aus der Datei und speichert die Zeichenkette in einem Puffer, an den das NULL-Zeichen '\0' als letztes Zeichen angehängt wird.
  • fscanf(Dateizeiger, Konvertierungsspezifizierer, Variablenadressen): Diese Funktion dient zum Parsen und Analysieren von Daten. Sie liest Zeichen aus der Datei und weist die Eingabe mithilfe von Konvertierungsspezifizierern einer Liste von Variablenzeigern (Variablenadressen) zu. Beachten Sie, dass fscanf, wie auch scanf, das Einlesen einer Zeichenkette beendet, sobald ein Leerzeichen oder ein Zeilenumbruch auftritt.

Das folgende Programm demonstriert das Lesen aus der Datei fputs_test.txt unter Verwendung der Funktionen fgets(), fscanf() und fgetc():

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Ergebnis:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Ausgabe beim Lesen von Daten aus einer Datei in C

  1. Im obigen Programm haben wir die Datei „fprintf_test.txt“ geöffnet, die zuvor mit der Funktion fprintf() erstellt wurde und den Inhalt „Learning C with“ enthält. GuruDie Zeichenkette „99“ wird mithilfe der Funktion fgets() zeilenweise gelesen, wobei die Puffergröße ausreichend sein muss, um die gesamte Zeile zu verarbeiten.
  2. Wir öffnen die Datei erneut, um den Dateizeiger auf den Dateianfang zurückzusetzen. Wir erstellen verschiedene String-Variablen, um jedes Wort einzeln zu verarbeiten. Anschließend geben wir die Variablen aus, um ihren Inhalt anzuzeigen. Die Funktion `fscanf()` wird hauptsächlich verwendet, um …tract und Daten aus einer Datei parsen.
  3. Öffnen Sie die Datei erneut, um die Zeigerdatei so zurückzusetzen, dass sie auf den Anfang der Datei zeigt. Lesen Sie Daten und drucken Sie sie Zeichen für Zeichen aus der Datei mit der Funktion getc() aus, bis die EOF-Anweisung auftritt
  4. Nachdem wir mit verschiedenen Varianten einen Lesevorgang der Datei durchgeführt haben, haben wir die Datei erneut mit der Funktion fclose geschlossen.

Interaktives Lesen und Schreiben von Dateien mit getc und putc

Dies sind die einfachsten Dateioperationen. Getc steht für „Get Character“ und putc für „Put Character“. Diese beiden Funktionen werden verwendet, um jeweils nur ein einzelnes Zeichen zu verarbeiten.

Das folgende Programm demonstriert die Dateiverwaltungsfunktionen in der C-Programmierung:

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

Ausgang:

Interaktives Lesen und Schreiben von Dateien in C-Ausgabe

getc und putc verarbeiten die Ausgabe von Dateien in C

  1. Im obigen Programm haben wir eine Datei namens Demo erstellt und im Schreibmodus geöffnet.
  2. Nachdem ein Schreibvorgang ausgeführt wurde, wird die Datei mit der Funktion fclose geschlossen.
  3. Wir haben erneut eine Datei geöffnet, die nun Daten im Lesemodus enthält. Eine While-Schleife wird ausgeführt, bis das Ende der Datei gefunden ist. Sobald das Ende der Datei gefunden ist, wird der Vorgang beendet und die Daten werden mithilfe der Funktion printf angezeigt.
  4. Nach der Durchführung eines Lesevorgangs wird die Datei mit der Funktion fclose wieder geschlossen.

Häufig gestellte Fragen

Der Textmodus übersetzt Zeilenumbruchzeichen entsprechend dem Betriebssystem, während der Binärmodus, der mit „rb“ oder „wb“ geöffnet wird, Bytes exakt so schreibt, wie sie sind. Verwenden Sie den Binärmodus für Bilder, Audio oder alle Daten, bei denen das genaue Byte-Layout erhalten bleiben muss.

Die Funktion `fopen` gibt `NULL` zurück, wenn eine Datei nicht geöffnet werden kann, z. B. weil die Datei fehlt, die Zugriffsrechte fehlen oder die Festplatte voll ist. Prüfen Sie den zurückgegebenen Zeiger immer auf `NULL`, bevor Sie Daten lesen oder schreiben. Andernfalls verwendet das Programm einen ungültigen Zeiger und stürzt in der Regel ab.

Der Schreibmodus „w“ kürzt eine bestehende Datei, indem er ihren Inhalt vor dem Schreiben löscht, und erstellt die Datei, falls sie nicht vorhanden ist. Der Anhängemodus „a“ behält die vorhandenen Daten bei und fügt neue Inhalte am Ende hinzu, sodass keine bereits gespeicherten Daten verloren gehen.

fseek bewegt den Dateizeiger um einen Byte-Offset, gemessen von SEEK_SET, SEEK_CUR oder SEEK_END. ftell gibt die aktuelle Byte-Position des Zeigers zurück, und rewind setzt ihn an den Dateianfang zurück. Zusammen ermöglichen sie den wahlfreien Zugriff anstelle des sequenziellen Lesens.

fgets liest eine ganze Zeile, Stoppping fscanf bricht nach einem Zeilenumbruch oder nach n-1 Zeichen ab und berücksichtigt dabei die Puffergröße. Es liest formatierte, durch Leerzeichen getrennte Tokens und kann bei kurzen Arrays zu einem Überlauf führen. Für das sichere Einlesen ganzer Zeilen ist fgets die bessere Wahl.

EOF ist eine Konstante, üblicherweise -1, die das Ende einer Datei markiert. Lesefunktionen wie getc, fgetc und fscanf geben EOF zurück, sobald keine Daten mehr vorhanden sind. Daher vergleichen Schleifen ihr Ergebnis mit EOF, um das Lesen zu beenden.

Ja. Ein KI-Programmierassistent kann anhand einer einfachen Spracheingabe fopen-, fprintf- und fgets-Routinen generieren, die einzelnen Dateimodi erklären und Fehler wie fehlende NULL-Prüfungen oder nicht geschlossene Dateien erkennen. Kompilieren und testen Sie den von der KI vorgeschlagenen Code immer, bevor Sie ihm vertrauen.

GitHub-Copilot Es generiert Code zur Dateiverarbeitung in C und schlägt anhand eines kurzen Kommentars oder Funktionsnamens vollständige fopen-, fputs- und fscanf-Blöcke vor. Oft fügt es den passenden fclose-Aufruf und eine Fehlerprüfung hinzu; dennoch sollten Sie die generierte Logik überprüfen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: