Программирование на C и C++

Онлайн справочник программиста на C и C++

lseek

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 Недействительный аргумент

 

Пример: 
Приведенный пример позволяет просмотреть файл по одному сектору за раз, используя UNIX- подобную систему ввода/вывода. Возможно, потребуется изменить размер буфера, чтобы адапти­ровать его к размеру сектора в системе.
#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;
}