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.

Retornar valor

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. Se stream for um ponteiro nulo ou se origin não for um dos valores permitidos descritos abaixo, e chame _fseeki64 o manipulador de parâmetros inválido, fseek 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 a stream um novo local que é 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 usar fseek 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 foi removido porque usar a combinação de e ou e ftell_ftelli64, para mover dentro de fseek um arquivo que termina com uma CTRL + Z pode causar fseek ou _fseeki64_fseeki64 se comportar incorretamente perto do final do arquivo.

Quando a CRT abre um arquivo que começa com uma BOM (Byte Order Mark), 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 para o início do arquivo, use ftell para obter a posição inicial e, em seguida, para essa posição em fseek vez de para fseek 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, consulte Estado global na 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