Utilice la función feof en C

Jinku Hu 12 octubre 2023
  1. Utilice la función feof para comprobar el indicador de fin de archivo en el flujo de archivos en C
  2. Utilice las funciones feof y ferror para probar la posición válida del flujo de archivos en C
Utilice la función feof en C

Este artículo explicará varios métodos de cómo utilizar la función feof en C.

Utilice la función feof para comprobar el indicador de fin de archivo en el flujo de archivos en C

La función feof es parte de la biblioteca de entrada/salida estándar de C, definida en el encabezado <stdio.h>. La función feof comprueba el indicador de fin de archivo en el flujo de archivo dado y devuelve un número entero distinto de cero si se establece EOF. Toma el puntero FILE como único argumento.

En el siguiente ejemplo, demostramos cuando el archivo se lee línea por línea usando la función getline, que se llama hasta que feof devuelve cero, lo que implica que el flujo de archivos no ha alcanzado el EOF. Observe que verificamos el valor de retorno de la función getline en una declaración condicional, y solo si tiene éxito llamamos a printf para generar la línea de lectura.

#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);
}

Utilice las funciones feof y ferror para probar la posición válida del flujo de archivos en C

Alternativamente, se puede utilizar feof para probar la posición del flujo del archivo antes de leer el contenido del archivo. En este caso, estamos leyendo el archivo usando la llamada fread, que toma el tamaño del archivo recuperado con la llamada a la función stat. Observe que el búfer para almacenar los bytes leídos se asigna en el montón usando la función malloc. Además, incluimos la función ferror en la declaración condicional para probar el estado de error en el flujo de archivos junto con el indicador 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);
}

ferror también es parte de la biblioteca de E/S y se puede llamar en el objeto puntero FILE. Devuelve un indicador distinto de cero si el bit de error se establece en la secuencia del archivo. Tenga en cuenta que los tres ejemplos imprimen el contenido del archivo especificado por la variable filename. En el código de muestra anterior, generamos el contenido almacenado usando la función printf, pero el método más propenso a errores sería la llamada fwrite, que puede imprimir el número dado de bytes en el flujo FILE especificado por el cuarto argumento.

#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

Artículo relacionado - C IO