Под файлом в Турбо Паскале понимается либо поименованная область внешней памяти компьютера (жесткого диска или дискеты), либо логическое устройство (например, принтер).
В этом примере запись mem4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок из 4 байт. В зависимости от того, к какому полю происходит обращение в программе, этот участок рассматривается как массив из 4 байт (поле by), массив из двух целых чисел (поле wo) или как одно целое число типа longint (поле lo). Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам.
lo := sqr(150);
writeln(wo[0],’ ‘,wo[1]);
fori:=0 to3 dowrite(by[i],’ ‘); writeln;
end;
Приведем также пример, иллюстрирующий преобразование строки символов в массив байт и наоборот, причем программа способна фиксировать факт подобного преобразования.
program rec2;
{ Программа иллюстрирует работу с записями с вариантной частью.
Одна и та же область памяти трактуется либо как строка символов,
либо как длина и массив байт соответствующей длины.
Показана возможность неявного преобразования типов. }
st_byte = record
ps: 0..1; { признак альтернативы }
0: (s: string[20]);
1: (l: byte;
mb: array[1..20] of byte);
end;
rec: st_byte;
i,p: integer;
writeln('Вводить: 0 - строку, 1 - массив байт');
readln(rec.ps);
if rec.ps = 0 then{ ввод строки символов }
writeln('введите строку символов');
readln(rec.s);
else{ ввод массива из l байт }
writeln('введите число элементов массива (l)');
readln(rec.l);
writeln('введите массив из элементов типа байт');
for i:=1 to rec.l doread(rec.mb[i]);
readln
end;
writeln('выводить: 0 - строку, 1 - массив байт');
readln(p);
if p = 0 then{ задан вывод строки символов }
ifrec.ps = 1 then{ зафиксировано неявное преобразование типов }
writeln('преобразование: массив байт - строка');
writeln(rec.s) { вывод строки символов }
else{ задан вывод массива байт }
if rec.ps = 0 then{ зафиксировано неявное преобразование типов }
writeln('преобразование: строка - массив байт');
write('l= ',rec.l,' ' );
for i:=1 to rec.l dowrite(rec.mb[i]:4); {вывод массива байт }
writeln
end;
readln
Строго говоря, использовать подобное преобразование типов следует с большой осторожностью, поскольку очень легко получить некорректный результат. Если же преобразование типов не требуется, запись c вариантами должна включать в себя поле признака, где содержится номер (код) корректной альтернативы.
Любой файл имеет три характерные особенности.
· Во-первых, у него есть имя, что дает возможность программе работать сразу с несколькими файлами.
· Во-вторых, он содержит компоненты одного типа, в качестве которого может выступать любой тип Турбо Паскаля, кроме файла.
· В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройства внешней памяти.
Файлы в Турбо Паскале подразделяются на типизированные и текстовые. Для описания файла вводится так называемая файловая переменная, связывающая программу и файл. Описание типизированного файла задается с помощью ключевых слов file of, за которым следует имя типа. Например,