Lesen einer Datei in C

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktionen fopen und fread zum Lesen von Textdateien in C
  2. Verwenden der Funktionen fopen und getline zum Lesen von Textdateien in C
Lesen einer Datei 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);
}
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