Utilice 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 -
Utilice las funciones
feof
yferror
para probar la posición válida del flujo de archivos 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);
}
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