Типизированные файлы
К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных. Стандартное задание в программе такой файловой переменной осуществляется следующим образом:
Type
«имя типа»=record
….
end;
Var
F : file of «имя типа»;
Если в текстовых файлах содержимое рассматривается как наборы символов, подготовленные специальным образом с учетом общепринятых соглашений о представлении текстовой информации, то в типизированных файлах их содержимое рассматривается как последовательность записей определенной структуры. Единицей измерения такого набора данных является сама запись. Длина записи всегда одинакова, что дает возможность организовать прямой доступ к любому компоненту по его порядковому номеру, поэтому типизированные файлы часто называют файлами прямого доступа.
Seek(«имя файловой переменной»; «номер»)- Процедура устанавливает текущую файловую переменную на запись с указанным номером; файловая переменная для типизированных и нетипизированных наборов данных. При открытии типизированного файла текущая позиция для работы с ним установлена на начало первой записи, которая по принятым соглашениям имет номер 0, т. е. номер физической записи на единицу меньше номера логической записи. Это небольшое несоответствие в номерах может служить причиной возникновения ошибок чтения-записи, что в результате может привести к нарушению целостности важной информации. Положение усугубляется тем, что неверное позиционирование на запись с помощью процедуры Seek, как правило, не приводит к каким-либо видимым ошибкам ввода-вывода, на которые всегда можно отреагировать. Исключение составляют ситуации, когда нет доступа к файлу, файл не открыт или назначено позиционирование на несуществующую запись. Такие ситуации обрабатываются с помощью функции lOresult.
Типизированные файлы позволяют организовать работу в режиме чтения-записи. Эта возможность играет решающую роль при определении, каким типам файлов отдать предпочтение для большинства прикладных задач. Информация в типизированных наборах данных представлена в том же виде, как и в памяти машины во время выполнения программы, поэтому не надо отслеживать управляющие последовательности типа конец строки или возврат каретки.
Для работы с файлами прямого доступа дополнительно можно использовать радующие средства:
Truncate(«файл. переменная»)-Процедура уничтожает все компоненты файла, начиная с места текущего положения файлового указателя.
FilePos(«файл. переменная»)-Функция возвращает для файла текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longlnt
FilеSize («файл. переменная»)-функция, возвращает файлу его размер (количество записей) в виде значения типа Longint.
Для пустого файла вызов FifeSize возвращает значение 0.
Локализация ошибок при обращении, к внешним носителям для обоих функций производится через функцию lOresult.
Для того чтобы очередная запись могла быть записана в конец типизировавго файла, необходимо перевести текущую файловую позицию в конец файла, где создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установлена по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)), то в конец файла ее позволяет перевести вызов Seek (F, FileSize (F))
В каждом файле число логических и физических записей совпадает, а при позиционировании номер физической записи на единицу меньше номера логической записи.
Задание. Создать файл, содержащий фамилии и телефоны знакомых. Предусмотреть поиск по фамилии, просмотр справочника.
Program _;
Uses crt;
type tel=record
FIO:string[30];
nomer: longint;
end;
file_tel= file of tel;
var f:file_tel;
name,st:string;
Procedure vvod_zapisi(var z: tel);
begin
writeln('введите ФИО и номер телефона');
with z do
begin
readln(fio);
readln(nomer);
end;
end;
procedure VVod_file(var r:file_tel);
var n,i:byte;
z:tel;
begin
rewrite(r);
writeln('сколько записей будем вводить');
readln(n);
for i :=1 to n do
begin
vvod_zapisi(z);
write(r,z);
end;
close(r);
readln;
end;
Procedure vivod_zapisi(z: tel);
begin
write(z.fio:20);
writeln(z.nomer:15);
end;
procedure shapka;
begin
textcolor(5);
write(' ФИО ':20);
writeln(' телефон ':15);
textcolor(15);
end;
procedure ViVod_file(var r:file_tel);
var n,i:byte;
z:tel;
begin
clrscr;
shapka;
reset(r);
i :=0;
while not(eof(r)) do
begin
seek(r,i);
read(r,z);
vivod_zapisi(z);
i:=i+1;
end;
close(r);
readln;
end;
procedure poisk(var r:file_tel;s:string);
var z:tel;
i:byte;
begin
writeln('введите фио');
readln(s);
reset(r);
i:=0;
clrscr;
shapka;
while not eof(r) do
begin
seek(r,i);
read(r,z);
if z.fio=s then vivod_zapisi(z) ;
i:=i+1;
end;
readln;
end;
procedure menu(var r:file_tel);
var k:byte;
begin
repeat
clrscr;
writeln('что будем делать?');
writeln('1:создание телефонного справочника');
writeln('2:дозапись в справочник');
writeln('3:вывод справочника');
writeln('4:поиск по ФИО');
writeln('5: выход ');
write('ваш выбор ');
readln(k);
case k of
1:vvod_file(r);
{2:redak_file(r);}
3:vivod_file(r);
4:poisk(r,st)
end;
until k=5;
end;
{основная программа}
begin
clrscr;
writeln('введите имя файла');
readln(name);
assign(f,name);
menu(f);
end.
Лекция 40.
Дата добавления: 2016-05-25; просмотров: 1326;