Ferramentas do usuário

Ferramentas do site


lseek

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.


lseek [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1
Linha 1: Linha 1:
 +====== Função lseek ======
 +
 +Sintaxe:
 +
 +''[[off_t]] lseek([[tipos_dados|int]] iFileDescritor,  [[off_t]] offset, [[tipos_dados|int]] whence);''
 +
 +----
 +
 +
 +Como visto anteriormente, tanto a leitura como a gravação de informações no arquivo é realizada a partir da posição atual do arquivo.
 +
 +Com a função **lseek** pode-se posicionar em um determinado ponto do arquivo antes da leitura ou gravação de dados. O primeiro byte do arquivo é a posição 0 (zero).
 +
 +Após a execução da função, ela retorna a posição atual do arquivo. Caso ocorra algum erro no posicionamento a função irá retornar –1.
 +
 +O posicionamento via função **lseek** é realizado através da informação de um deslocamento positivo ou negativo a partir de posições definidas no terceiro parâmetro. Pode-se colocar as seguintes posições:
 +
 +  * **SEEK_SET** - O deslocamento informado será baseado no início do arquivo. O deslocamento deve zero ou um valor positivo pois não tem sentido se posicionar antes do início do arquivo.
 +  * **SEEK_CUR** - O deslocamento será efetuado baseado na posição atual do arquivo. Para se posicionar antes da posição atual, passa-se um valor negativo no deslocamento. Para se avançar no arquivo, coloca-se um valor positivo no deslocamento.
 +  * **SEEK_END** - O deslocamento será efetuado a partir do final do arquivo. Nesta situação pode-se colocar um deslocamento negativo ou positivo. Caso se indique um deslocamento positivo e se faça uma gravação no arquivo, este estará sendo estendido.
 +
 +Veja o exemplo:
 +
 +<code c>
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <errno.h>
 +#include <fcntl.h>
 +#include <sys/types.h>
 +#include <unistd.h>
 +
 +int main (int argc, char  *argv[])
 +{
 +   int iFileDescriptor;
 +   int i;
 +
 +   if( argc < 2 )
 +   {
 +      fprintf(stderr,"Obrigatório informar o nome do arquivo\n");
 +      exit(1);
 +   }
 +
 +   /* abre o arquivo, truncando o mesmo caso já exista */
 +   iFileDescriptor = open (argv[1], O_RDWR | O_CREAT | O_TRUNC, 0755);
 +   if (iFileDescriptor < 0)
 +   {
 +      perror (argv[0]);
 +      exit (errno);
 +   }
 +   printf ("Arquivo '%s' aberto\n", argv[1]);
 +
 +
 +   for (i= 1; i<= 10; i++)
 +   {
 +      if  (write (iFileDescriptor, &i, sizeof(int)) < 0) /* gravando números no arquivo */
 +      {
 +         perror (argv[0]);
 +         exit (errno);
 +      }
 +   }
 +
 +   /* Se posicionando no sexto registro com a função lseek. O sexto registro começa na 20º byte do arquivo, ou seja,  5 registros * 4 bytes (tamanho do int). */
 +   if (lseek (iFileDescriptor, 5 * sizeof(int), SEEK_SET) < 0)
 +   {
 +      perror (argv[0]);
 +      exit (errno);
 +   }
 +
 +   i = 127;
 +   if (write (iFileDescriptor, &i, sizeof(int)) < 0) /* e gravando o número 127 nesta posição */
 +   {
 +      perror (argv[0]);
 +      exit (errno);
 +   }
 +
 +   /* posicionando-se no inicio do arquivo... */
 +   if (lseek (iFileDescriptor, 0, SEEK_SET) < 0)
 +   {
 +      perror (argv[0]);
 +      exit (errno);
 +   }
 +
 +   while(read (iFileDescriptor, &i, sizeof(int)) > 0) /* ... e lendo o arquivo até o final */
 +   {
 +      printf ("Valor lido |%d|\n", i);
 +   }
 +
 +   close (iFileDescriptor);
 +   return 0;
 +}
 +</code>
 +
 + --- //[[marcos@laureano.eti.br|Marcos Laureano]] 2008/04/25 07:07//
  
lseek.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1