lenguaje - manejo de archivos en c ejemplos
fseek en una posición más allá de EOF no desencadena EOF usando feof, ¿por qué? (3)
Buscar más allá del final del archivo en algunos sistemas operativos aumenta el tamaño del archivo. Mientras haya espacio para agrandar el archivo, nunca devolverá un error.
Estoy leyendo datos de un archivo en la memoria que se abre con:
FILE *f = fopen(path, "rb");
Antes de comenzar a copiar bytes desde el archivo, busco una posición de inicio usando:
/**
* Goes to the given position of the given file.
*
* - Returns 0 on success
* - Returns -1 on EOF
* - Returns -2 if an error occured, see errno for error code
* - Returns -3 if none of the above applies. This should never happen!
*/
static int8_t goto_pos(FILE *f, uint64_t pos)
{
int err = fseek(f, pos, SEEK_SET);
if (err != 0) {
if (feof(f) != 0) return -1;
if (ferror(f) != 0) return -2;
return -3;
}
return 0;
}
El problema es que aunque busco una posición más allá de EOF
, esta función nunca devuelve -1.
Según la referencia, feof
debería devolver un valor distinto de cero cuando se encuentre EOF
.
¿Por qué es esto? ¿ feof
función feof
es inútil?
Tenga en cuenta que actualmente estoy usando el valor de retorno de fgetc
para verificar EOF
.
Buscar simplemente no prueba el final del archivo.
La razón de esto es que quizás desee hacer un fwrite()
donde lo intentó. fseek()
no puede saber para qué son tus planes una vez que se llamó.
Haga un fread()
después de buscar detrás del final del archivo y tendrá feof()
devolver un valor distinto de cero.
feof()
se establece después de que un intento de lectura falla, por lo que fgets()
o fread()
antes.