РАБОТА С ФАЙЛАМИ. ФАЙЛОВЫЙ ТИП
. . .
Type
Type
Type
ОПИСАНИЕ ТИПА ЗАПИСЬ
Лекция №8 Типы данных, определяемые пользователем. Записи. Описание файлового типа.
Запись — это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов. Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end. Между ними заключен список компонентов, называемыхполями, с указанием идентификаторов полей и типа каждого поля.
Формат:
type
<имя типа> = record
<Идентификатор поля>:<тип компонента>;
. . .
<Идентификатор поля>:<тип компонента>
end;
var
<идентификатор,...> : <имя типа>;
Пример:
Car = record
Number:integer;{Номер}
Marka:string[20];{Марка автомобиля}
FIO:string[40];{Фамилия, инициалы владельца}
Address:string[60]{Адрес владельца}
end;
var
M, V : Car;
В данном примере запись Car содержит четыре компонента: номер, название марки машины, фамилию владельца и его адрес. Доступ к полям записи осуществляется через переменную типа "запись". В нашем случае это переменные M и V типа Car.
Идентификатор поля должен быть уникален только в пределах записи, однако во избежание ошибок лучше делать его уникальным в пределах всей программы. Объем памяти, необходимый для записи, складывается из длин полей.
Значения полей записи могут быть использованы в выражениях. Имена отдельных полей не применяются по аналогии с идентификаторами переменных, поскольку может быть несколько записей одинакового типа. Обращение к значению поля осуществляется с помощью идентификатора переменной и идентификатора поля, разделенных точкой. Такая комбинация называется составным именем. Например - чтобы получить доступ к полям записи Саг, надо записать:
M.Number, M.Marka, M.FIO, M.Address
Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания.
Пример:
M.Number := 1678;
M.Marka := ‘ГАЗ – 24’;
M.FIO := ‘Демьяшкин В.А.’ ;
M.Address := ‘ул. Пушкина 12 – 31’;
Составные имена можно использовать, в частности, в операторах ввода-вывода:
Read(M.Number, M.Marka, M.FIO, M.Address);
Write(M.Number:4, M.Marka:7, M.FIO:12, M.Address:25);
Допускается применение оператора присваивания и к записям в целом, если они имеют один и тот же тип. Например,
V := M;
После выполнения этого оператора значения полей записи V станут равны значениям соответствующих полей записи M.
В ряде задач удобно пользоваться массивами из записей. Их можно описать следующим образом:
Person = record
FO : string[20];
Age : 1 . . 99;
Prof : string[30]
end;
var
List : array[1..50] of Person;
Обращение к полям записи имеет несколько громоздкий вид, что особенно неудобно при использовании мнемонических идентификаторов длиной более пяти символов. Для решения этой проблемы в языке Паскаль предназначен оператор with, который имеет следующий формат:
with <переменная типа запись> do <оператор>;
Один раз указав переменную типа запись в операторе with, можно работать с именами полей как с обычными переменными, т. е. без указания перед идентификатором поля имени переменной, определяющей запись.
Пример:
Присвоить значения полям записи Car с помощью оператора with.
with M do begin
Number := 2347;
Marka := ‘ГАЗ – 24’ ;
FIO := ‘Петров В.И.’;
Address : = ‘ул. Остужева, 5’
end;
Паскаль допускает вложение записей друг в друга (т. е. поле в записи может быть в свою очередь тоже записью), соответственно оператор with тоже может быть вложенным:
with RV1 do
with RV2 do
with RVn do ...
что эквивалентно записи
with RV1, RV2, . . . , RVn do ...
Уровень вложения не должен превышать 9.
Записи используются обычно при работе с динамическими структурами и для организации файлов на магнитных дисках. Записи могут служить также для описания комплексных чисел, так как в языке Паскаль нет для этого специальных средств. В этом случае действительная и мнимая части комплексного числа являются полями записи, например:
Complex = record
RealPart: real;{Действительная часть}
ImagePart: real;{Мнимая часть}
end;
var
A, B, C : Complex;{A, B, C — переменные типа Complex}
begin
A.RealPart:= 6.3;
A.ImagePart:= 1.9;
Под файлом понимается либо именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, электронного "виртуального" диска), либо логическое устройство - потенциальный источник или приемник информации.
По содержанию, под файлом понимают любой набор элементов одного и того же типа. Число элементов, называемое длиной файла, не фиксировано. В этом основное отличие файла от массива. Файл, не содержащий ни одного элемента, называется пустым: его длина равна нулю.
Файлы по методу доступа к их элементам подразделяются на файлы последовательного и прямого доступа. В стандартном языке Паскаль определены файлы только последовательного доступа, в которых каждый элемент становится доступным только после перебора всех предыдущих элементов.
В Турбо Паскале можно работать и с файлами прямого доступа, которые позволяют обращаться к каждому элементу непосредственно по его порядковому номеру в файле.
Файлы должны быть описаны в разделе описаний программы. Описание файлов имеет следующий вид:
var
имя_файла : file of базовый_тип;
В качестве базового типа элементов файла можно использовать любой тип данных (как простой, так и сложный) за исключением типа file.
Вообще говоря, файловый тип или переменную файлового типа можно задать одним из трех способов:
<имя> = file of <тип>;
<имя> = TEXT;
<имя> = File;
В зависимости от способа объявления можно выделить три вида файлов:
1) типизированные файлы (задаются предложением FILE OF ...);
2) текстовые файлы (определяются типом TEXT);
3) не типизированные файлы (определяются типом FILE).