[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Перемещение позиции чтения/записи файла

Системный вызов lseek(2) устанавливает позицию чтения/записи в
открытом файле. fildes является дескриптором файла, полученным после
вызова open(2). lseek(2) устанавливает позицию файла fildes следующим
образом:
Если whence равно SEEK_SET (символьная константа 0), позиция
устанавливается равной offset.
Если whence равно SEEK_CUR (символьная константа 1), то позиция
устанавливается равной offset плюс текущая позиция.
Если whence равно SEEK_END (символьная константа 2), позиция
устанавливается равной размеру файла плюс offset.
Константы для whence определены в <unistd.h>. При удачном завершении,
возвращается новая позиция чтения/записи, измеренная в расстоянии от
начала файла. offset может быть как положительным, так и
отрицательным. Попытка переместиться за начало файла вызывает неуспех
и устанавливает код ошибки в errno.
lseek(2) может установить позицию в конец файла или за конец файла.
При позиционировании в или за конец файла, read(2) вернет нулевое
число прочитанных байт. Однако до этой позиции можно записывать
данные. Блоки данных будут выделяться только при записи в блок.
Позиционирование за пределы файла и запись может вызвать "провал" в
блоках данных, которые не будут выделены для файла. Чтение из этого
провала возвращает требуемое число нулевых байтов.
Вызов lseek(2) не влияет на состояние самого файла. Он только изменяет
позицию чтения/записи для открытого файла. Эта позиция автоматически
изменяется при чтении/записи с использованием вызовов read(2) или
write(2) на число переданных байтов. Следовательно, следующие вызовы
read(2) и write(2) приведут к операции с данными, расположенными по
новой позиции чтения/записи.
Новое для SVR4: константы SEEK_SET, SEEK_CUR, SEEK_END.
               ПЕРЕМЕЩЕНИЕ ПОЗИЦИИ ЧТЕНИЯ/ЗАПИСИ ФАЙЛА
lseek(2)

ИМЯ

      lseek - переместить позицию чтения/записи файла

ИСПОЛЬЗОВАНИЕ

      #incldue <sys/types.h>
      #include <unistd.h>

      off_t lseek( int fildes,
          off_t offset, int whence);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех - расстояние в байтах от начала файла

      неуспех - -1 и errno установлена
                          lseek(2) - Примеры

.    перемотка
          Позиция чтения/записи устанавливается в начало файла.

.    добавление
          Позиция чтения/записи устанавливается в конец файла.

.    модификация
          Для модификации  записи сначала  эта  запись  считывается  и
          затем  изменяется.  lseek(2)  используется  для  возвращения
          позиции на  начало записи.  В  заключение,  запись  в  файле
          перезаписывается новой информацией.

.    запись позиции
          lseek(2) используется для записи текущей позиции файла.

.    увеличение размера файла
          Если MAX  положительное число,  lseek(2)  установит  текущую
          позицию чтения/записи  за пределами  текущего  конца  файла.
          Файл будет увеличен, когда произойдет вызов write(2).
                          lseek(2) - ПРИМЕРЫ
.    перемотка
    lseek (fd, 0, SEEK_SET);

.    добавление
    lseek (fd, 0, SEEK_END);

.    модификация
    read (fd, &record, sizeof (record));
    /* update */
    lseek (fd, -sizeof (record), SEEK_CUR);
    write (fd, &record, sizeof (record));

.    запись позиции
    loc = lseek (fd, 0, SEEK_CUR);

.    увеличение размера файла
    lseek (fd, MAX * sizeof(record), SEEK_END);
    write (fd, &record, sizeof (record));