Процедуры и функции для работы с типизированными файлами
Для работы с типизированными файлами, кроме процедур Assign, открытия и закрытия файлов, ввода и вывода данных, можно использовать процедуры и функции: Eof, Erase, ReName, loResult, Seek, FileSize, FilePos и Truncate. Процедуры и функции Eof, Erase, ReName и loResult рассмотрены ранее.
Процедура Seek смещает указатель файла к требуемому компоненту файла. Форма обращения к процедуре Seek:
Seek ( файловая-переменная, номер-компонента ) ;
где номер-компонента — выражение типа LONGINT, номер требуемого компонента; первый компонент файла имеет номер 0.
Например: Seek (F, 0) ; - смещение указателя к началу файла F.
Функция FileSize возвращает значение типа LONGINT, которое содержит количество компонентов (записей) файла. Форма обращения:
FileSize ( файловая-переменная );
Например: N := FileSize ( F ) ; – определение значения N − количества компонентов файла F.
Для перемещения указателя в конец файла, например, для его дополнения новыми записями, можно использовать следующее обращение:
Seek ( F, FileSize (F) ) ;
где F – файловая-переменная.
Функция FilePos возвращает значение типа LONGINT, порядковый номер того компонента файла, который будет обрабатываться следующей операцией ввода-вывода.
Форма обращения к функции:
FilePos ( файловая-переменная ) ;
Например: FilePos ( F );.
Для перемещения указателя к предыдущему компоненту файла, например к компоненту, найденному с помощью программы, можно использовать обращение к функции Seek в виде:
Seek (F, FilePos (F) – 1 ) ;
После этого можно, например, возвратить скорректированную запись, т. е. записать ее на прежнее место процедурой Write ее обновленное значение.
Процедура Truncate отсекает часть файла от текущего положения файлового указателя до конца файла. Процедура Truncate применима к любым типам файлов, кроме текстовых. Для усечения файла он должен быть открыт для записи или чтения.
Формат обращения к процедуре Truncate:
Truncate ( файловая-переменная );
Например: Truncate ( F );.
Рассмотрим пример схемы алгоритма процедуры, использующей усечение файла и соответствующего ей фрагмента программы.
В примере производится поиск и удаление записи с требуемой фамилией. Если поиск неуспешен, выдается сообщение, что TFM ошибочна. Если поиск успешен, то с помощью процедуры Р выводится содержимое удаляемой записи. Удаление записи, содержащей фамилию, заданную в TFM, производится путем сдвига всех записей, расположенных после записи с TFM, на одну запись к началу файла F и усечения (укорочения) файла.
Сначала определяется количество записей файла F: KL = FileSize (F) ;.
Для поиска удаляемой записи вводится требуемая фамилия из файла FI в переменную TFM.
Вводится запись из файла F в переменную Z.
Анализируется ее значение Z.FIO:
1) если Z.FIO <>TFM, анализируется "конец файла F";
2) если Z.FIO = TFM, т. е. найдена удаляемая запись, выводится сообщение «Удаляем запись» и ее содержимое с помощью процедуры Р.
Затем анализируется положение указателя:
1) если EOF (F) = TRUE, т.е. удаляется последняя запись файла, то указатель перемещается на предпоследнюю запись с помощью SEEK (F, KL – 1);
2) если EOF (F) = FALSE, т.е. удаляется не последняя запись, то с помощью цикла по I все записи, расположенные после удаляемой, сдвигаются на одну запись к началу файла.
После установки указателя на последнюю запись или после «сдвига» всех записей, остающихся в файле, выполняется усечение файла с помощью процедуры Truncate (F);, затем производится выход из процедуры с помощью процедуры Exit.
Фрагмент программы:
KL := FileSize (F) ; { - количество записей файла}
....READLN (FI, TFM) ; { - ввод TFM из файла FI }
REPEAT READ ( F, Z); {- начало поиска записи для удаления }
IF TFM = Z.FIO THEN { - найдена запись для удаления }
BEGIN
WRITELN (‘ УДАЛЯЕМ ЗАПИСЬ:’) ; P;
IF EOF (F) THEN SEEK ( F, KL – 1) { - удаляем последнюю запись}
ELSE { - сдвиг записей в сторону начала файла}
FOR I := FilePos (F) TO KL – 1 DO
BEGIN
SEEK (F, I) ; READ (F, Z) ; { - читать I – ю запись}
SEEK (F, I – 1) ; WRITE (F, Z) ; { писать ее на место (I – 1) – ой}
END; { - конец сдвига}
Truncate (F) ; Exit ; { - усечение файла и выход}
END ; { -оператора IF}
UNTIL EOF (F) ; { - конец поиска записи в файл F}
WRITELN ( TFM, ‘ошибочно’) ......;