Обычно ввод-вывод выполняется в файле линейно, и все действия поиска, в которых
возникает необходимость, относятся только к неявному обновлению позиции
в файле после операций считывания и записи. Некоторым приложениям,
однако, приходится перемещаться по файлу. Системный вызов lseekO предназначен
для установки позиции в файле, соответствующем файловому дескриптору.
Помимо обновления позиции в файле, он больше ничего не делает и вообще
никакие действия ввода-вывода не инициирует:
finclude
finclude
off t lseek (int fd. off t pos, int origin);
Поведение lseekO зависит от аргумента origin, который может принимать
следующие значения:
SEEKCUR
Текущая позиция в файле fd увеличивается на значение аргумента pos, который
может содержать отрицательное, положительное и пулевое значение.
Если pos равен нулю, то возвращается значение текущей позиции в файле.
SEEKEND
В качестве текущей позиции в файле fd устанавливается значение, равное
текущей длине файла плюс значение pos. Аргумент pos может содержать отрицательное,
положительное и нулевое значение. Если pos равен нулю, то
смещение устанавливается па конец файла.
SEEK_SET
Текущая позиция в файле fd приравнивается значению аргумента pos. Если
pos равен нулю, то смещение устанавливается на начало файла.
В случае успеха вызов возвращает новую позицию в файле. В случае ошибки
он возвращает значение -1 и соответствующим образом устанавливает переменную
еггпо.
Например, чтобы установить позицию в файле fd па значение 1825, используйте
следующий код:
o f f J rot ,
ret = lseek (fd. (off_L) 1825. SEtK_SH).
it (ret ==? (off_t) 1)
/* ошибка */
Этот код устанавливает позицию в файле fd на конец файла:
oft_t r e t .
rot - lseek (fd. 0. SltKJNI)).
і f (rot == ( o f f t ) I )
/* ошибка */
Так как вызов lseekO возвращает обновленное значение позиции в файле,
его можно использовать для поиска текущей позиции в файле, используя значение
pos, равное нулю, и значение origin, равное SEEK CUR:
int pos.
pos = lseek (fd. 0, SEtK_CUR),
if (pos == (off_t) 1)
/* ошибка */
else
/* 'pos' э ю іекущая позиция в файле fd */
Чаще всего lseekO используют для поиска начала файла, конца файла или определения
текущей позиции в файле, связанном с данным дескриптором файла.