Verwendung der feof-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion feof, um den End-of-file-Indikator im Dateistrom in C zu prüfen
  2. Verwenden der Funktionen feof und ferror zum Testen der gültigen Position des Dateistroms in C
Verwendung der feof-Funktion in C

In diesem Artikel werden mehrere Methoden zur Verwendung der Funktion feof in C erläutert.

Verwenden Sie die Funktion feof, um den End-of-file-Indikator im Dateistrom in C zu prüfen

Die Funktion feof ist Teil der C-Standard-Ein-/Ausgabebibliothek, die im Header <stdio.h> definiert ist. Die Funktion feof prüft auf den Dateiende-Indikator im angegebenen Dateistrom und gibt eine Ganzzahl ungleich Null zurück, wenn EOF gesetzt ist. Sie nimmt den Zeiger FILE als einziges Argument.

Im folgenden Beispiel demonstrieren wir, wenn die Datei zeilenweise gelesen wird, indem wir die Funktion getline verwenden, die so lange aufgerufen wird, bis feof Null zurückgibt, was bedeutet, dass der Dateistrom das EOF nicht erreicht hat. Beachten Sie, dass wir den Rückgabewert der Funktion getline in einer bedingten Anweisung überprüfen, und nur bei Erfolg rufen wir printf auf, um die gelesene Zeile auszugeben.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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* contents = NULL;
  size_t len = 0;

  while (!feof(in_file)) {
    if (getline(&contents, &len, in_file) != -1) {
      printf("%s", contents);
    }
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Verwenden der Funktionen feof und ferror zum Testen der gültigen Position des Dateistroms in C

Alternativ kann feof verwendet werden, um die Position des Dateistroms zu testen, bevor wir den Inhalt der Datei lesen. In diesem Fall lesen wir die Datei mit dem Aufruf fread, der die mit dem Funktionsaufruf stat ermittelte Dateigröße übernimmt. Beachten Sie, dass der Puffer zum Speichern der gelesenen Bytes mit der Funktion malloc auf dem Heap alloziert wird. Außerdem haben wir die Funktion ferror in die bedingte Anweisung aufgenommen, um den Fehler-Status auf dem Dateistrom zusammen mit dem EOF-Indikator zu testen.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  printf("read data: %s\n", file_contents);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Die Funktion ferror ist ebenfalls Teil der I/O-Bibliothek und kann mit dem Zeigerobjekt FILE aufgerufen werden. Es gibt einen Indikator ungleich Null zurück, wenn das Fehlerbit auf dem Dateistrom gesetzt ist. Beachten Sie, dass alle drei Beispiele den Inhalt der Datei ausgeben, die durch die Variable filename angegeben wird. Im vorherigen Beispielcode geben wir den gespeicherten Inhalt mit der Funktion printf aus, aber die fehleranfälligere Methode wäre der Aufruf von fwrite, der die angegebene Anzahl von Bytes in den durch das vierte Argument angegebenen FILE-Stream drucken kann.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  fwrite(file_contents, 1, sb.st_size, stdout);

  free(file_contents);

  fclose(in_file);
  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 IO