Файлы с прямым и последовательным доступом (Лабораторная работа № 15), страница 4

Функция   FILEPOS  задает  возвращение  номера доступного элемента. Единственным аргументом в ее вызове является идентификатор файловой  переменной,  а  возвращается значение типа Longlnt. Например, при значении файловой переменной f, изображенном последним, после присваивания:

А := FilePos   ( f );

переменная А типа Longlnt получит значение 3.

Для определения общего количества элементов в файле используют функцию FILESIZE. Единственным аргументом в ее вызове является идентификатор файловой переменной, а возвращается значение типа Longlnt. Например, значением переменной N типа  Longintпосле присваивания:

N  :=  FileSize  (f)

становится количество элементов в файле.

Понятно, что, используя в программе вызовы процедуры seek в паре с вызовами read или write, мы сможем прочитать любой элемент файла или изменить его значение.

В частности, с помощью процедур seek, filesize и write можно расширить файл, дописывая значения нового элемента в конец:

Sееk ( f,  filesize  (f));

                                                      write(f, v)

После вызова seek файловый указатель устанавливается за последним элементом, т.е.

 


а после вызова write значение vзаписывается в новый элемент, после чего файловый указатель перемещается вправо:

 


Процедура TRUNCATE задает уничтожение остатка файла, начи­ная с доступного элемента. Например, после выполнения вызовов:

seek(f,  3);   truncate (f)

элементы с 3-го по последний уничтожаются, остаются элементы с номерами 0, 1 и 2.

Использование процедур прямого доступа позволяет удалять элементы из файла.

Пример:

Запишем программу, которая задает удаление ненужных эле­ментов файла, т.е. его уплотнение.

Пусть в файле Group.dat хранится информация о студентах груп­пы: фамилия, имя и средний балл. С клавиатуры вводится фамилия студента, который выбыл, – запись о нем надо удалить из файла.

В следующей программе файл читается до конца и во вспомога­тельный файл копируются записи, значение поля Surname (фамилия), которое отличается от заданной фамилии. Далее файлы закрываются, и средствами модуля System старый файл просто уничтожается, а вспомогательному присваивается внешнее имя старого.

program OutFromGroup;

type Student = record

Surname, Name : string[20];

Ball : real;

end;

var Fi, Fo : file of Student;   

FileName: string;

procedure OpenFile;

begin

writeln(‘Задайтеимяфайла’);

readln(FileName);

assign(Fi, FileName);

reset(Fi);

assign(Fo, 'NewFile.dat');

rewrite(Fo);

end;

procedure ClearFile;                                     {Процедурасжатияфайла}

var St : Student;

StudtoOut : string[20];

begin

writeln(‘Задайте фамилию студента, запись о котором удаляется: ’); readln(StudtoOut);

while not eof(Fi) do begin

read(Fi, St) ;

if St.Surname<>StudtoOut then

write(Fo, St)

end;

close(Fi);  

close(Fo);                                       {Вызовыпроцедурмодуля System}

Erase(Fi);                                                      {дляуничтожения}

ReName(Fo, FileName);                          {ипереименованияфайла}

end;

begin

OpenFile;  

ClearFile;

end.

Кроме операций замены и удаления элементов файла, опишем операцию вставки элемента в произвольное место файла. Пусть место задается номером нового элемента в файле. Для вставки используют один из двух алгоритмов.

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

Открыть основной и вспомогательный файлы.