Usa la funzione feof in C
-
Utilizzare la funzione
feof
per controllare l’indicatore di fine file sul flusso di file in C -
Usa le funzioni
feof
eferror
per testare la posizione valida del flusso di file in C
![Usa la funzione feof in C](/img/C/feature-image---feof-stdin-in-c.webp)
Questo articolo spiegherà diversi metodi su come utilizzare la funzione feof
in C.
Utilizzare la funzione feof
per controllare l’indicatore di fine file sul flusso di file in C
La funzione feof
fa parte della libreria standard di input / output C, definita nell’intestazione <stdio.h>
. La funzione feof
controlla l’indicatore di fine file sul flusso di file dato e restituisce un numero intero diverso da zero se EOF
è impostato. Accetta il puntatore FILE
come unico argomento.
Nell’esempio seguente, dimostriamo quando il file viene letto riga per riga utilizzando la funzione getline
, che viene chiamata finché feof
non restituisce zero, il che implica che il flusso del file non ha raggiunto EOF
. Si noti che verifichiamo il valore di ritorno della funzione getline
in un’istruzione condizionale e solo se ha successo chiamiamo printf
per visualizzare la riga di lettura.
#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);
}
Usa le funzioni feof
e ferror
per testare la posizione valida del flusso di file in C
In alternativa, feof
può essere utilizzato per testare la posizione del flusso di file prima di leggere il contenuto del file. In questo caso, stiamo leggendo il file usando la chiamata fread
, che prende la dimensione del file recuperata con la chiamata alla funzione stat
. Si noti che il buffer per memorizzare i byte letti viene allocato sull’heap utilizzando la funzione malloc
. Inoltre, abbiamo incluso la funzione ferror
nell’istruzione condizionale per testare lo stato errore
sul flusso di file insieme all’indicatore EOF
.
#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);
}
Anche ferror
fa parte della libreria I/O e può essere chiamato sull’oggetto puntatore FILE
. Restituisce un indicatore diverso da zero se il bit di errore è impostato sul flusso di file. Nota che tutti e tre gli esempi stampano il contenuto del file specificato dalla variabile filename
. Nel codice di esempio precedente, abbiamo emesso il contenuto memorizzato usando la funzione printf
, ma il metodo più soggetto a errori sarebbe la chiamata fwrite
, che può stampare il numero di byte specificato nel flusso FILE
specificato dal quarto argomento.
#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