Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
int fseek ( FILE * stream, long offset, int origin ) ;
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* 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)