Шаг 36.
Доступ к файлу. Функции tell() и seek()

    На этом шаге мы рассмотрим назначение и использование функций tell() и seek().

    Файлы в Perl интерпретируются как неструктурированные потоки байтов. При работе с файлом через дескриптор отслеживается его текущая позиция. Операции чтения/записи выполняются с текущей позиции файла. Если, например, была прочитана запись длиной 80 байт, то следующая операция чтения или записи начнется с 81 байта файла.

    Для определения текущей позиции в файле используется функция tell(), единственным параметром которой может быть дескриптор файла. Она возвращает текущую позицию в связанном с дескриптором файле. Эта же функция без параметра возвращает текущую позицию в файле, для которого была в программе выполнена последняя операция чтения.

    Текущая позиция в файле автоматически изменяется в соответствии с выполненными операциями чтения/записи. Ее можно изменить с помощью функции seek (), которой передаются в качестве параметров дескриптор файла, смещение и точка отсчета. Для связанного с дескриптором файла устанавливается новая текущая позиция, смещенная на заданное параметром СМЕЩЕНИЕ число байт относительно точки отсчета:

    seek ДЕСКРИПТОР, СМЕЩЕНИЕ, ТОЧКА_ОТСЧЕТА;

    Параметр ТОЧКА_ОТСЧЕТА может принимать одно из трех значений:

    Смещение может быть как положительным, так и отрицательным. Обычно оно отрицательно для смещения относительно конца файла и положительно для смещения относительно начала файла. Для задания точки отсчета можно воспользоваться константами SEEK_SET, SEEK_CUR и SEEK_END из модуля IO::Seekable, которые соответствуют началу файла, текущей позиции и концу файла. Естественно, необходимо подключить этот модуль к программе с помощью ключевого слова use. Например, следующие операторы устанавливают одинаковые текущие позиции в файлах:

    use IO::Seekable; 
    seek FILE1, 5, 0; 
    seek FILE2, 5, SEEK_SET;

    Для перехода в начало или в конец файла следует использовать нулевое смещение относительно соответствующих точек отсчета при обращении к функции seek() :

    seek FILE1, 0, 0;  # Переход в начало файла.
    seek FILE1, 0, 2;  # Переход в конец файла.

    На следующем шаге мы рассмотрим еще несколько функций для работы с файлами.




Предыдущий шаг Содержание Следующий шаг