Lesen einer Datei in C
-
Verwendung von die Funktionen
fopen
undfread
zum Lesen von Textdateien in C -
Verwenden der Funktionen
fopen
undgetline
zum Lesen von Textdateien in C
Dieser Artikel stellt mehrere Methoden vor, wie man eine Textdatei in C lesen kann.
Verwendung von die Funktionen fopen
und fread
zum Lesen von Textdateien in C
Die Funktionen fopen
und fread
sind Teil der Ein-/Ausgabefunktionen der C-Standardbibliothek.
fopen
wird verwendet, um die angegebene Datei als Stream zu öffnen und dem Programm den Handle zu geben, um sie nach Bedarf zu manipulieren. Es nimmt zwei Parameter entgegen, den Namen der Datei als const char*
-String und den Modus, in dem die Datei geöffnet werden soll, der mit vordefinierten Werten angegeben wird (r
, w
, a
, r+
, w+
, a+
). Wenn wir eine Datei lesen müssen, übergeben wir r
als zweiten Parameter, um die Datei im Nur-Lese-Modus zu öffnen.
Auf der anderen Seite ist die Funktion fread
der Hauptakteur bei der Durchführung der Leseoperation aus einem bereits geöffneten Dateistrom. Sie nimmt als erstes Argument einen Zeiger auf den Puffer, in dem die gelesenen Bytes gespeichert werden sollen. Das zweite und dritte Argument geben an, wie viele Elemente aus dem Datenstrom gelesen werden sollen und welche Größe jedes dieser Elemente hat. Das letzte Argument ist der FILE*
-Zeiger auf den geöffneten Dateistrom selbst.
Beachten Sie, dass wir auch die Funktion stat
verwenden, um die Dateigröße abzufragen und den gesamten Inhalt in einem einzigen fread
-Aufruf zu lesen. Die Dateigröße wird auch an die Funktion malloc
übergeben, um genügend Speicherplatz zum Speichern des gesamten Dateiinhalts zu reservieren. Beachten Sie jedoch, dass dynamische Speicherzuweisungen mit der Funktion free
wieder freigegeben und offene Dateien mit fclose
geschlossen werden sollten.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(void) {
const char* filename = "input.txt";
FILE* input_file = fopen(filename, "r");
if (!input_file) exit(EXIT_FAILURE);
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char* file_contents = malloc(sb.st_size);
fread(file_contents, sb.st_size, 1, input_file);
printf("%s\n", file_contents);
fclose(input_file);
free(file_contents);
exit(EXIT_SUCCESS);
}
Verwenden der Funktionen fopen
und getline
zum Lesen von Textdateien in C
Alternativ können wir die Abfrage der Dateigröße mit der Funktion stat
überspringen und stattdessen mit der Funktion getline
über jede Zeile der Datei iterieren, bis das Ende erreicht ist. getline
liest die Zeichenketteneingabe aus dem angegebenen Dateistrom. Wie der Name schon sagt, liest die Funktion alle Bytes bis zum Zeilenumbruchzeichen.
getline
nimmt drei Parameter entgegen, von denen der erste die gelesenen Bytes speichert. Er kann als char*
deklariert und auf NULL
gesetzt werden. Wenn das zweite Argument die Adresse der Ganzzahl 0
ist, weist getline
automatisch dynamischen Speicher für den Puffer zu, der vom Benutzer freigegeben werden sollte, daher der Aufruf der Funktion free
am Ende des Programms.
Beachten Sie, dass diese Parameter bei Bedarf unterschiedliche Werte haben können, die alle in dieser Funktion Handbuch erklärt werden. Der dritte Parameter ist der FILE*
-Zeiger des geöffneten Dateistroms.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(void) {
const char* filename = "input.txt";
FILE* input_file = fopen(filename, "r");
if (!input_file) exit(EXIT_FAILURE);
char* contents = NULL;
size_t len = 0;
while (getline(&contents, &len, input_file) != -1) {
printf("%s", contents);
}
fclose(input_file);
free(contents);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook