Поиск при помощи lseek()

Jul 05, 2012 13:39




Обычно ввод-вывод выполняется в файле линейно, и все действия поиска, в которых

возникает необходимость, относятся только к неявному обновлению позиции



в файле после операций считывания и записи. Некоторым приложениям,

однако, приходится перемещаться по файлу. Системный вызов 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 используют для поиска начала файла, конца файла или определения

текущей позиции в файле, связанном с данным дескриптором файла.

Previous post Next post
Up