====== 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: #include #include #include #include #include #include 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; } --- //[[marcos@laureano.eti.br|Marcos Laureano]] 2008/04/25 07:07//