fseek
, _fseeki64
Move o ponteiro do arquivo para um local especificado.
Sintaxe
int fseek(
FILE *stream,
long offset,
int origin
);
int _fseeki64(
FILE *stream,
__int64 offset,
int origin
);
Parâmetros
stream
Ponteiro para a estrutura FILE
.
offset
Número de bytes de origin
.
origin
Posição inicial.
Valor retornado
Em caso de sucesso, fseek
e _fseeki64
retornarão 0. Caso contrário, retornará um valor diferente de zero. Em dispositivos sem capacidade de busca, o valor retornado será indefinido. If stream
é um ponteiro nulo ou if origin
não é um dos valores permitidos descritos abaixo fseek
e _fseeki64
invoca o manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução puder continuar, essas funções definirão errno
como EINVAL
e retornarão -1.
Comentários
As fseek
funções e _fseeki64
movem o ponteiro do arquivo (se houver) associado stream
a um novo local que seja offset
bytes de origin
. A operação seguinte no fluxo ocorre no novo local. Em um fluxo aberto para atualização, a operação seguinte pode ser uma leitura ou uma gravação. O argumento origin
deve ser uma das constantes a seguir, definidas em STDIO.H
:
Valor de origin | Significado |
---|---|
SEEK_CUR |
Posição atual do ponteiro de arquivo. |
SEEK_END |
Final do arquivo. |
SEEK_SET |
Início do arquivo. |
Você pode usar fseek
e _fseeki64
para reposicionar o ponteiro em qualquer lugar de um arquivo. O ponteiro também pode ser posicionado após o final do arquivo. fseek
e _fseeki64
limpam o indicador de fim do arquivo e anulam o efeito do qualquer chamada de ungetc
anterior para stream
.
Quando um arquivo é aberto para acrescentar dados, a posição do arquivo atual é determinada pela última operação de E/S e não por onde a gravação seguinte ocorreria. Se nenhuma operação de E/S tiver ocorrido em um arquivo aberto para acréscimo, a posição do arquivo será o início do arquivo.
Para fluxos abertos no modo de texto, fseek
e _fseeki64
têm uso limitado, pois as conversões de retorno de carro e avanço de linha podem fazer com que fseek
e _fseeki64
produzam resultados inesperados. As únicas operações de fseek
e _fseeki64
com garantia de funcionar em fluxos abertos no modo de texto são:
buscar com um deslocamento de 0 em relação a qualquer um dos valores de origem.
Buscar desde o início do arquivo com um valor de deslocamento retornado de uma chamada para
ftell
ao usarfseek
ou_ftelli64
ao usar_fseeki64
.
Também no modo de texto, CTRL+Z é interpretado como um caractere de fim do arquivo na entrada. Em arquivos abertos para leitura/gravação, fopen
e todas as rotinas relacionadas verificam se há um CTRL+Z no fim do arquivo e o removem, se possível. Ele é removido porque usar a combinação de e ou e , _ftelli64
para mover dentro de fseek
um arquivo que termina com CTRL+Z pode causar fseek
ou _fseeki64
se comportar incorretamente perto do final do _fseeki64
arquivo.ftell
Quando o CRT abre um arquivo que começa com uma BOM (Marca de Ordem de Byte), o ponteiro do arquivo é posicionado após a BOM. (Ou seja, ele é posicionado no início do conteúdo real do arquivo). Se você tiver que fseek
ir para o início do arquivo, use ftell
para obter a posição inicial e, em seguida fseek
, para essa posição em vez de para a posição 0.
Essa função bloqueia outros threads durante a execução e, portanto, é thread-safe. Para uma versão sem bloqueio, confira _fseek_nolock
, _fseeki64_nolock
.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Requisitos
Função | Cabeçalho necessário |
---|---|
fseek |
<stdio.h> |
_fseeki64 |
<stdio.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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'.
Confira também
E/S de fluxo
fopen
, _wfopen
ftell
, _ftelli64
_lseek
, _lseeki64
rewind