long lseek(int handle, long offset, int origin)
Функция lseek() является частью UNIX-подобной системы ввода/вывода и не определена в стандарте ANSI С.
Функция lseek() устанавливает указатель положения в файле, указанном дескриптором handle, в положение, указанное аргументами offset и origin.
Действия lseek() зависят от значений аргументов origin и offset. Аргумент origin может принимать значения 0, 1 или 2. В следующей таблице показано, как интерпретируется смещение offset для каждого значения origin:
Origin | Результат обращения к lseek() |
---|---|
0 | Смещение отсчитывается от начала файла |
1 | Смещение отсчитывается от текущей позиции |
2 | Смещение отсчитывается от конца файла |
В файле io.h определены перечисленные ниже макросы. Они могут использоваться в качестве значения origin в порядке от 0 до 2.
SEEK_SET
SEEK_CUR
SEEK_END
В случае успеха функция lseek() возвращает offset, т.е. целое число типа long. При неудаче возвращается — 1L и errno устанавливается в одно из следующих значений:
EBADF | Недействительный номер файла |
EINVAL | Недействительный аргумент |
#include <stdio.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <io.h>
#include <stdlib.h>
#define BUF_SIZE 128
/* чтение буферов с помощью lseek() */
int main(int argc, char *argv[])
{
char buf[BUF_SIZE+1], s[10];
int fd, sector;
buf[BUF_SIZE+1] = '\0'; /* оканчивающийся нулем буфер для printf */
if((fd=open(argv[1], O_RDONLY | O_BINARY))==-1) { /* открытие для записи */
printf("Cannot open file.\n");
exit(0);
}
do {
printf("Buffer: ");
gets(s);
sector = atoi(s); /* получение сектора для чтения */
if(lseek(fd, (long)sector*BUF_SIZE,0)==-1L)
printf("Seek Error\n");
if(read(fd, buf, BUF_SIZE)==0) {
printf("Read Error\n");
}
else {
printf("%s\n", buf);
}
} while(sector > 0);
close(fd);
return 0;
}