Usa la funzione feof in C

Jinku Hu 12 ottobre 2023
  1. Utilizzare la funzione feof per controllare l’indicatore di fine file sul flusso di file in C
  2. Usa le funzioni feof e ferror per testare la posizione valida del flusso di file in C
Usa la funzione feof in C

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);
}
Autore: 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

Articolo correlato - C IO