lseek(), lseek64()

Установить текущую позицию в файле на уровне ОС

Прототип:

#include <sys/types.h>
#include <unistd.h>
off_t lseek( int filedes,
off_t offset,
int whence );
off64_t lseek64( int filedes,
off64_t offset,
int whence );

Аргументы:

filedes
Файловый дескриптор файла, позицию для которого необходимо установить.
offset
Относительное смещение от позиции файла, определяемое аргументом whence.
whence
Позиция в файле. Возможные значения (определенные в <unistd.h>):
SEEK_CUR
Новая позиция файла вычисляется относительно текущей позиции файла. Значение смещения offset может быть положительным, отрицательным или нулевым.
SEEK_END
Новая позиция файла вычисляется относительно конца файла.
SEEK_SET
Новая позиция файла вычисляется относительно начала файла. Значение смещения offset не должно быть отрицательным.

Библиотека:

libc

Описание:

Эти функции устанавливают текущую позицию файла для дескриптора файла, указанного filedes на уровне операционной системы. Дескрипторы файлов возвращаются при успешном выполнении одной из функций creat(), dup(), dup2(), fcntl(), open() или sopen().

Ошибка возникает, если запрошенная позиция файла перед началом файла.

Если запрошенная позиция файла находится за пределами конца файла и данные записываются в этот момент, последующие чтения данных в образованном промежутке будут возвращать байты, значение которых равно нулю ('\0') до тех пор, пока данные не будут фактически записаны в образованный промежуток.

Эти функции не увеличивают размер файла (см. chsize()).

Возвращаемое значение:

Текущая позиция в файле, где 0 указывает начало файла.

Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EBADF
Аргумент fildes не является допустимым файловым дескриптором, открытым для записи.
EINVAL
Аргумент whence имеет неподходящее значениее или полученное смещение файла недопустимо.
ENOSYS
Функция lseek() не реализована для файловой системы, указанной в filedes.
EOVERFLOW
Полученное смещение файла - это значение, которое не может быть правильно представлено в объекте типа off_t.
ESPIPE
Аргумент fildes связан с неименованными (pipe) или именованными (fifo) каналами.

Примеры:

Используя функцию lseek(), можно получить текущую позицию файла (фактически, функция tell() реализована именно таким образом). Затем можно использовать это значение с другим вызовом lseek() для сброса позиции файла:

off_t file_posn;
int filedes;
/* get current file position */
file_posn = lseek( filedes, 0L, SEEK_CUR );
...
/* return to previous file position */
file_posn = lseek( filedes, file_posn, SEEK_SET );

Если все записи в файле имеют одинаковый размер, положение n-й записи можно вычислить и прочитать следующим образом:

#include <sys/types.h>
#include <unistd.h>
int read_record( int filedes, long rec_numb,
int rec_size, char *buffer )
{
if ( lseek( filedes, rec_numb * rec_size, SEEK_SET ) == -1L )
{
return (-1);
}
return (read( filedes, buffer, rec_size ));
}

Функция read_record() в этом примере предполагает, что записи нумеруются, начиная с нуля, и что rec_size содержит размер записи в файле, включая любые символы-разделители записей.

Классификация:

lseek() — POSIX 1003.1; lseek64() — Поддержка больших файлов

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

chsize(), close(), creat(), dup(), dup2(), eof(), errno, execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), fcntl(), fileno(), fstat(), isatty(), open(), read(), sopen(), stat(), tell(), umask(), write()




Предыдущий раздел: Описание API системной библиотеки