fseek
|
Definido en el encabezado
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* unspecified */
|
||
Establece el indicador de posición de archivo para el flujo de archivo stream al valor apuntado por offset .
Si el stream está abierto en modo binario, la nueva posición es exactamente offset bytes medidos desde el comienzo 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 . Los flujos binarios no están obligados a soportar SEEK_END , particularmente si se emiten bytes nulos adicionales.
Si el stream está abierto en modo texto, los únicos valores soportados para offset son cero (que funciona con cualquier origin ) y un valor devuelto por una llamada anterior a ftell en un stream asociado al mismo archivo (que solo funciona con origin de SEEK_SET ).
Si el stream está orientado a caracteres anchos, se aplican las restricciones tanto de flujos de texto como binarios (el resultado de ftell está permitido con SEEK_SET y el desplazamiento cero está permitido desde SEEK_SET y SEEK_CUR , pero no desde SEEK_END ).
Además de cambiar el indicador de posición del archivo,
fseek
deshace los efectos de
ungetc
y limpia el estado de fin de archivo, si es aplicable.
Si ocurre un error de lectura o escritura, el indicador de error para el flujo ( ferror ) se establece y la posición del archivo no se ve afectada.
Contenidos |
Parámetros
| stream | - | flujo de archivo a modificar |
| offset | - | número de caracteres para desplazar la posición relativa al origen |
| origin | - | posición a la cual se añade offset . Puede tener uno de los siguientes valores: SEEK_SET , SEEK_CUR , SEEK_END |
Valor de retorno
0 en caso de éxito, valor distinto de cero en caso contrario.
Notas
Después de buscar una posición que no sea el final en un flujo amplio, la siguiente llamada a cualquier función de salida puede dejar el resto del archivo indefinido, por ejemplo, al generar una secuencia multibyte de una longitud diferente.
Para flujos de texto, los únicos valores válidos de offset son 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 existente del archivo. Si se realiza una salida después de esta búsqueda, cualquier lectura del espacio devolverá bytes cero. Donde sea compatible con el sistema de archivos, esto crea un sparse file .
POSIX también requiere que
fseek
primero realice
fflush
si hay datos no escritos (pero si el estado de desplazamiento se restaura está definido por la implementación).
POSIX especifica que
fseek
debe retornar
-
1
en caso de error, y establecer
errno
para indicar el error.
En Windows,
_fseeki64
puede utilizarse para trabajar con archivos mayores a 2 GiB.
Ejemplo
fseek
con verificación de errores:
#include <stdio.h> #include <stdlib.h> int main(void) { // Preparar un array de valores double. #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // Escribir array a un archivo. FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // Leer los valores double en el array B. double B[SIZE]; fp = fopen("test.bin", "rb"); // Establecer el indicador de posición del archivo antes del tercer valor double. if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0) { fprintf(stderr, "fseek() failed in file %s at line # %d\n", __FILE__, __LINE__ - 2); fclose(fp); return EXIT_FAILURE; } int ret_code = fread(B, sizeof(double), 1, fp); // lee un valor double printf("ret_code == %d\n", ret_code); // imprime el número de valores leídos printf("B[0] == %.1f\n", B[0]); // imprime un valor fclose(fp); return EXIT_SUCCESS; }
Salida posible:
ret_code == 1 B[0] == 3.0
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.23.9.2 La función fseek (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.21.9.2 La función fseek (p: 245)
- 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
Véase también
|
mueve el indicador de posición del archivo a una ubicación específica en un archivo
(función) |
|
|
obtiene el indicador de posición del archivo
(función) |
|
|
devuelve el indicador de posición actual del archivo
(función) |
|
|
mueve el indicador de posición del archivo al principio de un archivo
(función) |
|
|
C++ documentation
para
fseek
|
|