C - Datei-E/A
Das letzte Kapitel erläuterte die standardmäßigen Eingabe- und Ausgabegeräte, die von der Programmiersprache C verwaltet werden. Dieses Kapitel behandelt, wie C-Programmierer Text- oder Binärdateien für ihre Datenspeicherung erstellen, öffnen und schließen können.
Eine Datei stellt eine Folge von Bytes dar, unabhängig davon, ob es sich um eine Textdatei oder eine Binärdatei handelt. Die Programmiersprache C bietet Zugriff auf Funktionen auf hoher Ebene sowie auf Aufrufe auf niedriger Ebene (Betriebssystemebene), um Dateien auf Ihren Speichergeräten zu handhaben. Dieses Kapitel führt Sie durch die wichtigen Aufrufe zur Dateiverwaltung.
Öffnen von Dateien
Sie können fopen( ) verwenden Funktion zum Erstellen einer neuen Datei oder zum Öffnen einer vorhandenen Datei. Dieser Aufruf initialisiert ein Objekt vom Typ FILE , die alle Informationen enthält, die zur Steuerung des Streams erforderlich sind. Der Prototyp dieses Funktionsaufrufs ist wie folgt:−
FILE *fopen( const char * filename, const char * mode );
Hier, Dateiname ist ein Zeichenfolgenliteral, das Sie verwenden, um Ihre Datei zu benennen und auf den Modus zuzugreifen kann einen der folgenden Werte haben −
Sr.No. | Modus &Beschreibung |
---|---|
1 | r Öffnet eine vorhandene Textdatei zum Lesen. |
2 | w Öffnet eine Textdatei zum Schreiben. Wenn es nicht existiert, wird eine neue Datei erstellt. Hier beginnt Ihr Programm mit dem Schreiben von Inhalten am Anfang der Datei. |
3 | ein Öffnet eine Textdatei zum Schreiben im Anhängemodus. Wenn es nicht existiert, wird eine neue Datei erstellt. Hier beginnt Ihr Programm mit dem Anhängen von Inhalten an den vorhandenen Dateiinhalt. |
4 | r+ Öffnet eine Textdatei zum Lesen und Schreiben. |
5 | w+ Öffnet eine Textdatei zum Lesen und Schreiben. Es kürzt die Datei zuerst auf die Länge Null, falls sie existiert, ansonsten erstellt sie eine Datei, falls sie nicht existiert. |
6 | a+ Öffnet eine Textdatei zum Lesen und Schreiben. Es erstellt die Datei, wenn sie nicht existiert. Das Lesen beginnt von vorne, aber das Schreiben kann nur angehängt werden. |
Wenn Sie mit Binärdateien umgehen, verwenden Sie die folgenden Zugriffsmodi anstelle der oben genannten:−
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
Schließen einer Datei
Verwenden Sie zum Schließen einer Datei die Funktion fclose( ). Der Prototyp dieser Funktion ist −
int fclose( FILE *fp );
Das fclose(-) Die Funktion gibt bei Erfolg Null oder EOF zurück wenn beim Schließen der Datei ein Fehler auftritt. Diese Funktion löscht tatsächlich alle Daten, die noch im Puffer anstehen, in die Datei, schließt die Datei und gibt den für die Datei verwendeten Speicher frei. Der EOF ist eine Konstante, die in der Header-Datei stdio.h definiert ist .
Es gibt verschiedene Funktionen, die von der C-Standardbibliothek bereitgestellt werden, um eine Datei Zeichen für Zeichen oder in Form einer Zeichenfolge mit fester Länge zu lesen und zu schreiben.
Schreiben einer Datei
Es folgt die einfachste Funktion, um einzelne Zeichen in einen Stream zu schreiben −
int fputc( int c, FILE *fp );
Die Funktion fputc() schreibt den Zeichenwert des Arguments c in den von fp referenzierten Ausgabestrom. Es gibt das bei Erfolg geschriebene Zeichen zurück, ansonsten EOF wenn ein Fehler vorliegt. Sie können die folgenden Funktionen verwenden, um einen nullterminierten String in einen Stream zu schreiben −
int fputs( const char *s, FILE *fp );
Die Funktion fputs() schreibt den String s an den von fp referenzierten Ausgabestream. Es gibt bei Erfolg einen nicht negativen Wert zurück, andernfalls EOF wird im Fehlerfall zurückgegeben. Sie können int fprintf(FILE *fp,const char *format, ...) verwenden Funktion auch, um einen String in eine Datei zu schreiben. Probieren Sie das folgende Beispiel aus.
Stellen Sie sicher, dass Sie /tmp haben Verzeichnis vorhanden. Wenn dies nicht der Fall ist, müssen Sie dieses Verzeichnis auf Ihrem Computer erstellen, bevor Sie fortfahren.
#include <stdio.h> main() { FILE *fp; fp = fopen("/tmp/test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); }
Wenn der obige Code kompiliert und ausgeführt wird, erstellt er eine neue Datei test.txt im Verzeichnis /tmp und schreibt zwei Zeilen mit zwei verschiedenen Funktionen. Lassen Sie uns diese Datei im nächsten Abschnitt lesen.
Eine Datei lesen
Unten ist die einfachste Funktion, um ein einzelnes Zeichen aus einer Datei zu lesen −
int fgetc( FILE * fp );
Das fgetc() Die Funktion liest ein Zeichen aus der von fp referenzierten Eingabedatei. Der Rückgabewert ist das gelesene Zeichen oder im Fehlerfall EOF . Die folgende Funktion erlaubt das Lesen eines Strings aus einem Stream −
char *fgets( char *buf, int n, FILE *fp );
Die Funktionen fgets() liest bis zu n-1 Zeichen aus dem von fp referenzierten Eingabestrom. Es kopiert den gelesenen String in den Puffer buf , wobei eine null angehängt wird Zeichen zum Abschluss der Zeichenfolge.
Wenn diese Funktion auf ein Zeilenumbruchzeichen '\n' oder das Ende der Datei EOF stößt, bevor sie die maximale Anzahl von Zeichen gelesen hat, dann gibt sie nur die bis zu diesem Punkt gelesenen Zeichen zurück, einschließlich des Zeilenumbruchzeichens. Sie können auch int fscanf(FILE *fp, const char *format, ...) verwenden Funktion zum Lesen von Zeichenfolgen aus einer Datei, hört jedoch auf zu lesen, nachdem das erste Leerzeichen aufgetreten ist.
#include <stdio.h> main() { FILE *fp; char buff[255]; fp = fopen("/tmp/test.txt", "r"); fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff ); fclose(fp); }
Wenn der obige Code kompiliert und ausgeführt wird, liest er die im vorherigen Abschnitt erstellte Datei und erzeugt das folgende Ergebnis −
1 : This 2: is testing for fprintf... 3: This is testing for fputs...
Sehen wir uns etwas genauer an, was hier passiert ist. Zuerst fscanf() lies nur dies weil es danach auf ein Leerzeichen gestoßen ist, ist der zweite Aufruf für fgets() die die verbleibende Zeile liest, bis sie auf das Zeilenende trifft. Abschließend der letzte Aufruf fgets() liest die zweite Zeile komplett.
Binäre E/A-Funktionen
Es gibt zwei Funktionen, die für die binäre Ein- und Ausgabe verwendet werden können −
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
Diese beiden Funktionen sollten zum Lesen oder Schreiben von Speicherblöcken verwendet werden - normalerweise Arrays oder Strukturen.
C Sprache