По завершении работы с файлом его следует закрыть с помощью стандартной процедуры Close, имеющей следующий формат:
Close(<ф.п.>);
При создании нового или расширения старого файла эта процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры Close выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры Assign.
Приведем еще две полезные процедуры для работы с файлами – переименование и удаление файла.
Перед выполнением процедур Rename и Erase необходимо закрыть файл, если он был открыт процедурами Reset или Rewrite.
Дополнительную информацию о процедурах работы с файлами можно прочитать в литературе. См. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Стр. 119 - 131, 137 - 138.
Приведем пример программы, работающей с типизированным файлом.
program typ_file;
{ Программа работы с типизированными файлами на языке Турбо Паскаль.
Создается файл из записей, содержащих по 3 поля: фамилия, год рождения
и телефон. Записи сортируются по фамилиям, затем содержимое файла
выводится на экран. Для наглядности программа содержит отладочную
печать, отмеченную комментарием вида "о" }
uses CRT;
type person = record
fam: string[15]; {фамилия}
year: integer; {год рождения}
tel: string[10]; {телефон}
end;
var FP: file of person; {файловая переменная}
zap,zapt,zap_min: person;
nz,nz_min,LZ,i,j: integer;
name: string;
new_file: boolean; { признак вновь создаваемого файла }
ch:char;
begin
ClrScr; { очистка экрана }
write('Введите имя файла: ');
readln(name);
if name='' then name:='person.dat'; { если имя файла не введено, а нажата клавиша «Enter», то имя файла принимает значение ‘person.dat’ }
assign(fp,name); { связь файловой переменной с дисковым файлом }
new_file:=false;
{$I-}
reset(FP); { проверяем, есть ли файл на диске }
{$I+}
if IOResult=0 then writeln('Файл существует')
else { файл не существует }
begin
new_file:=true;
rewrite(FP); { создание нового файла }
repeat { ввод информации с экрана и вывод ее в файл }
if new_file then reset(FP); { вновь созданный файл необходимо открыть для чтения, а существующий файл уже был открыт ранее }
LZ:=FileSize(FP); { определение размера файла }
writeln('Файл содержит', LZ:3,' записей');
write('нужно сортировать [y/n]? ');
readln(ch);
if ch='y' then { сортировка по фамилиям }
begin
nz:=0; { nz - номер записи, нумерация записей начинается с 0 }
for i:=0 to LZ-2 do { цикл по количеству записей в файле - 1 }
begin
seek(FP,nz); { позиционирование на запись с номером nz }
read(FP,zap); { чтение записи с номером nz }
{o} writeln('считали запись',nz:3,' фамилия ',zap.fam);
zap_min:=zap; { запоминание записи с номером nz }
nz_min:=0; { номер записи, содержащей минимальную фамилию }
for j:=nz+1 to LZ-1 do { вложенный цикл - просмотр записей от текущей до конца файла. Позиционирование не требуется, поскольку записи считываются последовательно }
begin
read(FP,zapt); { чтение записи }
{o} writeln('считали запись',j:3,' фамилия ',zapt.fam);
if zapt.fam < zap_min.fam then { обнаружена запись с «меньшей» фамилией }
begin
zap_min:=zapt; { запоминание записи c «меньшей» фамилией }
nz_min:=j; { запоминание номера записи }
end
end;
if nz_min<>0 then { обмен записей с номерами nz_min и nz}
begin
{o} writeln('обмен записей nz=',nz:3,' и nz_min=',nz_min:3);
seek(FP,nz);
write(FP,zap_min); { вывод в файл записи с минимальной фамилией в позицию nz }
{o} writeln('вывели в файл запись',nz:3,' фамилия ',zap_min.fam);
seek(FP,nz_min);
write(FP,zap); { вывод ранее сохраненной записи в позицию nz_min }
{o} writeln('вывели в файл запись',nz_min:3,' фамилия ',zap.fam);
end;
nz:=nz+1; { приращение номера записи }
{o} readkey { приостанов отладочного вывода }
end
end;
{ вывод результата, т.е. содержимого файла }
ClrScr; { очистка экрана }
seek(FP,0); { позиционирование на начало файла }
writeln('Содержимое файла');
writeln;
while not EOF(FP) do { цикл по количеству записей в файле }
begin
read(FP,zap); { чтение текущей записи }
writeln(zap.fam,' ':16-length(zap.fam),zap.year:5,' ':2,zap.tel) { форматный вывод на экран (в виде таблицы) }
end;
readkey
end.
Список вопросов и заданий по теме «Типизированные файлы»
1. Допустимы ли следующие варианты программ и почему?