netlib.narod.ru< Назад | Оглавление | Далее >

8.4. Произвольный доступ (lseek)

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

Сайт управляется системой uCoz