Datei zeilenweise lesen mit fscanf in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion fscanf, um eine Datei zeilenweise in C zu lesen
  2. Verwendung der Funktion fscanf zum wortweisen Lesen von Dateien in C
Datei zeilenweise lesen mit fscanf 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C File