Datei zeilenweise lesen mit fscanf in C
-
Verwenden Sie die Funktion
fscanf
, um eine Datei zeilenweise in C zu lesen -
Verwendung der Funktion
fscanf
zum wortweisen Lesen von Dateien in C
In diesem Artikel werden verschiedene Methoden erklärt, wie man eine Datei zeilenweise mit fscanf
in C liest.
Verwenden Sie die Funktion fscanf
, um eine Datei zeilenweise in C zu lesen
Die Funktion fscanf
ist Teil der C-Standardbibliothek für formatierte Eingaben. Es werden mehrere Funktionen für verschiedene Eingabequellen bereitgestellt, wie scanf
zum Lesen aus stdin
, sscanf
zum Lesen aus der Zeichenkette und fscanf
zum Lesen aus dem Zeigerstrom FILE
. Letzterer kann verwendet werden, um die reguläre Datei zeilenweise zu lesen und im Puffer zu speichern.
fscanf
nimmt ähnliche Formatierungsangaben wie die printf
-Spezifikationen entgegen, und alle sind auf dieser Seite ausführlich aufgeführt. Im folgenden Beispiel öffnen wir die Beispiel-Eingabedatei mit dem Funktionsaufruf fopen
und allokieren Speicher in voller Dateigröße, um den Lesestrom darin zu speichern. Die Formatzeichenkette "%[^\n] "
wird angegeben, um den Dateistrom zu lesen, bis das neue Zeilenzeichen angetroffen wird. fscanf
gibt EOF
zurück, wenn das Ende der Eingabe erreicht ist; daher iterieren wir mit der while
-Schleife und drucken jede Zeile einzeln aus.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
struct stat sb;
stat(filename, &sb);
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Ausgabe:
> Temporary string to be written to file
Beachten Sie, dass der vorherige Code zwar höchstwahrscheinlich erfolgreich abläuft, wenn der Name der Eingabedatei im Dateisystem existiert, aber mehrere Funktionsaufrufe können trotzdem fehlschlagen und das Programm abnormal beenden. Der nächste Beispielcode ist die modifizierte Version, in der die Fehlerprüfungsroutinen implementiert sind.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Ausgabe:
> Temporary string to be written to file
Verwendung der Funktion fscanf
zum wortweisen Lesen von Dateien in C
Ein weiterer nützlicher Fall, um die Funktion fscanf
zu verwenden, ist, die Datei zu durchlaufen und jedes durch Leerzeichen getrennte Token zu parsen. Beachten Sie, dass das Einzige, was gegenüber dem vorherigen Beispiel geändert werden muss, der Formatbezeichner in "%[^\n ] "
ist. Der Systemaufruf stat
dient dazu, die Dateigröße abzufragen, und der Wert wird als Argument für malloc
verwendet, um den Puffer zu allozieren. Diese Methode kann für einige Szenarien verschwenderisch sein, aber sie stellt sicher, dass auch die größten einzeiligen Dateien im Puffer gespeichert werden können.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Ausgabe:
> Temporary
> string
> to
> be
> written
> to
> file
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