[<<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));