fseek, _fseeki64

Mueve el puntero de archivo a una ubicación especificada.

Sintaxis

int fseek(
   FILE *stream,
   long offset,
   int origin
);
int _fseeki64(
   FILE *stream,
   __int64 offset,
   int origin
);

Parámetros

stream
Puntero a la estructura FILE .

offset
Número de bytes desde origin.

origin
Posición inicial.

Valor devuelto

Si la operación se realiza correctamente, fseek y _fseeki64 devuelven 0. De lo contrario, devuelve un valor distinto de cero. En los dispositivos incapaces de efectuar búsquedas, el valor devuelto es indefinido. Si stream es un puntero nulo, o si origin no es uno de los valores permitidos que se describen a continuación, fseek e _fseeki64 invoque el controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, estas funciones establecen errno en EINVAL y devuelven -1.

Comentarios

Las fseek funciones y _fseeki64 mueven el puntero de archivo (si existe) asociado stream a una nueva ubicación que es offset bytes de origin. La siguiente operación de la secuencia se realiza en la nueva ubicación. En una secuencia abierta para actualización, la siguiente operación puede ser de lectura o de escritura. El argumento origin debe ser una de las constantes siguientes, que se definen en STDIO.H:

Valor de origen Significado
SEEK_CUR Posición actual del puntero de archivo.
SEEK_END Final del archivo.
SEEK_SET Principio de archivo.

Puede usar fseek y _fseeki64 para cambiar la posición del puntero a cualquier lugar de un archivo. El puntero también puede colocarse más allá del final del archivo. fseek y _fseeki64 borran el indicador de fin de archivo y anulan el efecto de las anteriores llamadas a ungetc en stream.

Cuando un archivo se abre para anexar datos, la posición de archivo actual se determina con la última operación de E/S, no en función de dónde se produciría la siguiente escritura. Si todavía no se ha producido ninguna operación de E/S en un archivo abierto para anexar, la posición de archivo se sitúa al principio del archivo.

En el caso de flujos abiertos en modo de texto, fseek y _fseeki64 tienen un uso limitado, porque las traslaciones de retorno de carro-avance de línea pueden hacer que fseek y _fseeki64 produzcan resultados inesperados. Las únicas operaciones fseek y _fseeki64 que se garantiza que funcionan en flujos abiertos en modo de texto son las siguientes:

  • Búsqueda con un desplazamiento de 0 en relación con cualquiera de los valores de origen.

  • Búsqueda desde el principio del archivo con un valor de desplazamiento devuelto en una llamada a ftell cuando se usa fseek o a _ftelli64 cuando se usa _fseeki64.

Además, en modo de texto, CTRL+Z se interpreta como un carácter de final de archivo en la entrada. En archivos abiertos para lectura/escritura, fopen y todas las rutinas relacionadas buscan un CTRL+Z al final del archivo y, si es posible, lo eliminan. Se quita porque el uso de la combinación de fseek y o _fseeki64 ftell y _ftelli64, para mover dentro de un archivo que termina con ctrl+Z puede provocar fseek o _fseeki64 comportarse incorrectamente cerca del final del archivo.

Cuando el CRT abre un archivo que comienza con una marca de orden de bytes (BOM), el puntero de archivo se coloca después de la lista de materiales. (Es decir, se coloca al principio del contenido real del archivo). Si tiene que ir fseek al principio del archivo, use ftell para obtener la posición inicial y, a continuación fseek , a esa posición en lugar de a la posición 0.

Esta función bloquea otros subprocesos durante la ejecución y por lo tanto es segura para subprocesos. Para consultar una versión que no sea de bloqueo, vea _fseek_nolock, _fseeki64_nolock.

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Requisitos

Función Encabezado necesario
fseek <stdio.h>
_fseeki64 <stdio.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.

#include <stdio.h>

int main( void )
{
   FILE *stream;
   char line[81];
   int  result;

   if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
   {
      printf( "The file fseek.out was not opened\n" );
      return -1;
   }
   fprintf( stream, "The fseek begins here: "
                    "This is the file 'fseek.out'.\n" );
   result = fseek( stream, 23L, SEEK_SET);
   if( result )
      perror( "Fseek failed" );
   else
   {
      printf( "File pointer is set to middle of first line.\n" );
      fgets( line, 80, stream );
      printf( "%s", line );
    }
   fclose( stream );
}
File pointer is set to middle of first line.
This is the file 'fseek.out'.

Vea también

E/S de secuencia
fopen, _wfopen
ftell, _ftelli64
_lseek, _lseeki64
rewind