Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 165

Файл заполняется последовательно от начала. Его структура всегда линейна: запись следует за записью. В нем не может быть «дыр». Добавить запись можно лишь в конец, удлинив тем самым сплошную их цепочку в файле. Правда, можно заместить любую

- 256 -

существующую в файле запись, но это не изменит его структуры и длины.

Для индексации структуры файла достаточно просто пронумеровать его записи, что и делается в Турбо Паскале. Но эта нумерация достаточно своеобразна. Можно считать, что нумеруются не записи, а как бы границы между ними (рис. 12.8). Эти границы — чистая условность, и в реальном файле записи не разделяются, а идут подряд. Просто они позволяют наглядно изобразить принцип нумерации записей. Самая первая граница (в начале файла) имеет номер 0.

Рис. 12.8

Если пронумеровать записи нормальным способом (первая, за ней вторая и т.д.), то получится, что реальный номер записи всегда на единицу больше номера границы перед ней. Рассмотрим работу функций прямого доступа в терминах нашего рисунка.

12.9.1. Опрос размеров файлов и позиции в них


12.9.1.1.Функция FileSize( VAR f) : LongInt. Эта функция возвращает реальное число записей в открытом файле f. Применительно к рис. 12.8, эта функция вернула бы значение n. Для пустого файла возвращаемое значение равно 0.

12.9.1.2.Функция FilePos( VAR f ) : LongInt Эта функция возвращает нашу текущую позицию в файле f. Файл должен быть открытым. Позиция в файле — это номер условной границы (см. рис. 12.8). Если файл только что открылся, то текущей позицией будет граница с номером 0. Это значит, что можно прочитать (или записать) запись с реальным номером (0+1)=1. После, например, ее прочтения позиция переместится на границу 1, и следующей можно будет прочитать запись (1+1)=2 и т.д. После прочтения последней записи в файле с реальным номером n позиция совпадает с границей с таким же номером n. Дальше записей нет. Поэтому, если FilePos

- 257 -

возвратила значение, равное FileSize, то мы находимся в конце файла за последней записью:

if FilePos( f ) = FileSize( f ) then { Все! Конец файла }

Все сказанное можно теперь сформулировать следующим образом:

1. В самом начале файла функция FilePos возвращает значение 0.

2. В самом конце файла функция FilePos возвращает число, равное реальному количеству записей в файле (FileSize).

3. В остальных случаях функция FilePos возвращает значение, на единицу меньшее реального номера записи, которая готова к прочтению или созданию.

12.9.2. Позиционирование в файлах


Операция назначения текущей позиции в файле (позиционирование) производится процедурой Seek. Процедура Seek(