netlib.narod.ru | < Назад | Оглавление | Далее > |
Ввод-вывод обычно бывает последовательным, т.е. каждая новая операция чтения-записи имеет дело с позицией файла, следующей за той, что была в предыдущей операции чтения-записи. При желании, однако, файл можно читать или проводить запись в него в произвольном порядке. Системный вызов lseek предоставляет способ передвигаться по файлу, не читая и не записывая данные. Так, функция
long lseek(int fd, long offset, int origin);
смещает текущую позицию в файле с дескриптором fd на величину offset относительно места, задаваемого значением origin. Значения параметра origin 0, 1 или 2 означают, что на величину offset отступают соответственно от начала, от текущей позиции или от конца файла. Например, если требуется добавить что-либо в файл (когда в командном интерпретаторе shell системы UNIX ввод перенаправлен оператором >> в файл или когда в fopen задан аргумент "a"), то прежде, чем что-либо записывать, необходимо найти конец файла с помощью вызова функции
lseek(fd, 0L, 2);
Чтобы вернуться назад, в начало файла, надо выполнить
lseek(fd, 0L, 0);
Следует обратить внимание на аргумент 0L: вместо 0L можно было бы написать (long) 0 или, если функция lseek должным образом объявлена, просто 0.
Благодаря lseek с файлами можно работать так, как будто это большие массивы, правда, с медленным доступом. Например, следующая функция читает любое число байтов из любого места файла. Она возвращает число прочитанных байтов или –1 в случае ошибки.
#include "syscalls.h" /* get: читает n байт из позиции pos */ int get(int fd, long pos, char *buf, int n) { if (lseek(fd, pos, 0) >= 0) /* установка позиции */ return read(fd, buf, n); else return -1; }
Возвращаемое функцией lseek значение имеет тип long и является новой позицией в файле или, в случае ошибки, равно –1. Функция fseek из стандартной библиотеки аналогична lseek; от последней она отличается тем, что в случае ошибки возвращает некоторое ненулевое значение, а ее первый аргумент имеет тип FILE*.
netlib.narod.ru | < Назад | Оглавление | Далее > |