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 usafseek
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