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; }
