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: | ||
| + | |||
| + | '' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | Como visto anteriormente, | ||
| + | |||
| + | 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 < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main (int argc, char *argv[]) | ||
| + | { | ||
| + | int iFileDescriptor; | ||
| + | int i; | ||
| + | |||
| + | if( argc < 2 ) | ||
| + | { | ||
| + | fprintf(stderr," | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | /* abre o arquivo, truncando o mesmo caso já exista */ | ||
| + | | ||
| + | if (iFileDescriptor < 0) | ||
| + | { | ||
| + | perror (argv[0]); | ||
| + | exit (errno); | ||
| + | } | ||
| + | | ||
| + | |||
| + | |||
| + | for (i= 1; i<= 10; i++) | ||
| + | { | ||
| + | if (write (iFileDescriptor, | ||
| + | { | ||
| + | | ||
| + | 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, | ||
| + | { | ||
| + | perror (argv[0]); | ||
| + | exit (errno); | ||
| + | } | ||
| + | |||
| + | i = 127; | ||
| + | if (write (iFileDescriptor, | ||
| + | { | ||
| + | perror (argv[0]); | ||
| + | exit (errno); | ||
| + | } | ||
| + | |||
| + | /* posicionando-se no inicio do arquivo... */ | ||
| + | if (lseek (iFileDescriptor, | ||
| + | { | ||
| + | perror (argv[0]); | ||
| + | exit (errno); | ||
| + | } | ||
| + | |||
| + | | ||
| + | { | ||
| + | printf (" | ||
| + | } | ||
| + | |||
| + | close (iFileDescriptor); | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | --- // | ||