Verwendung der feof-Funktion in C
-
Verwenden Sie die Funktion
feof
, um den End-of-file-Indikator im Dateistrom in C zu prüfen -
Verwenden der Funktionen
feof
undferror
zum Testen der gültigen Position des Dateistroms 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);
}
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