Luego de consultar expertos en la materia, programadores de deferentes áreas y profesores dimos con la solución a la cuestión y la plasmamos en este post.
Definido en el encabezado
|
||
---|---|---|
intfseek( FILE *stream,long offset,int origin ); |
Establece el indicador de posición del archivo para la secuencia de archivos. stream
al valor señalado por offset
.
Si el stream
está abierto en modo binario, la nueva posición es exactamente offset
bytes medidos desde el principio del archivo si origin
es SEEK_SET
, desde la posición actual del archivo si origin
es SEEK_CUR
, y desde el final del archivo si origin
es SEEK_END
. No es necesario que los flujos binarios admitan SEEK_END
, en particular si es adicional null se emiten bytes.
Si el stream
está abierto en modo texto, los únicos valores admitidos para offset
son cero (que funciona con cualquier origin
) y un valor devuelto por una llamada anterior a ftell
en una secuencia asociada con el mismo archivo (que solo funciona con origin
de SEEK_SET
).
Si el stream
es de orientación amplia, se aplican las restricciones de secuencias de texto y binarias (resultado de ftell
se permite con SEEK_SET y se permite el desplazamiento cero desde SEEK_SET y SEEK_CUR, pero no SEEK_END).
Además de cambiar el indicador de posición del archivo, fseek
deshace los efectos de ungetc
y borra el estado de fin de archivo, si corresponde.
Si se produce un error de lectura o escritura, el indicador de error de la secuencia (ferror
) está configurado y la posición del archivo no se ve afectada.
Parámetros
Arroyo | – | flujo de archivos para modificar |
compensar | – | número de caracteres para cambiar la posición relativa al origen |
origen | – | posición a la que offset está agregado. Puede tener uno de los siguientes valores: SEEK_SET , SEEK_CUR , SEEK_END |
Valor devuelto
0
en caso de éxito, valor distinto de cero en caso contrario.
Notas
Después de buscar una posición no final en una secuencia amplia, la siguiente llamada a cualquier función de salida puede hacer que el resto del archivo no esté definido, por ejemplo, generando una secuencia multibyte de una longitud diferente.
Para flujos de texto, los únicos valores válidos de offset
están 0
(aplicable a cualquier origin
) y un valor devuelto por una llamada anterior a ftell
(solo aplicable a SEEK_SET
).
POSIX permite buscar más allá del final del archivo existente. Si se realiza una salida después de esta búsqueda, cualquier lectura del intervalo devolverá cero bytes. Donde sea compatible con el sistema de archivos, esto crea un archivo disperso.
POSIX también requiere que fseek primero realice fflush
si hay datos no escritos (pero si el estado de cambio se restaura está definido por la implementación).
Ejemplo
fseek con comprobación de errores.
#include#include intmain(void)/* Prepare an array of f-p values. */#defineSIZE5double A[SIZE]=1.,2.,3.,4.,5.;/* Write array to a file. */ FILE * fp =fopen("test.bin","wb");fwrite(A,sizeof(double),SIZE,fp);fclose(fp);/* Read the f-p values into array B. */double B[SIZE]; fp =fopen("test.bin","rb");/* Set the file position indicator in front of third f-p value. */if(fseek(fp,sizeof(double)*2L,SEEK_SET)!=0)if(ferror(fp))perror("fseek()");fprintf(stderr,"fseek() failed in file %s at line # %dn",__FILE__,__LINE__-5);exit(EXIT_FAILURE);int ret_code =fread(B,sizeof(double),1,fp);/* read one f-p value */printf("%.1fn", B[0]);/* print one f-p value */fclose(fp);return EXIT_SUCCESS;
Producción:
3.0
Referencias
- Estándar C11 (ISO / IEC 9899: 2011):
- 7.21.9.2 La función fseek (p: 336-337)
- Estándar C99 (ISO / IEC 9899: 1999):
- 7.19.9.2 La función fseek (p: 302-303)
- Estándar C89 / C90 (ISO / IEC 9899: 1990):
- 4.9.9.2 La función fseek
Ver también
fsetpos | mueve el indicador de posición del archivo a una ubicación específica en un archivo (función) |
fgetpos | obtiene el indicador de posición del archivo (función) |
ftell | devuelve el indicador de posición de archivo actual (función) |
rebobinar | mueve el indicador de posición de archivo al principio de un archivo (función) |
Acuérdate de que te brindamos la opción de glosar tu experiencia .