2. Типізовані файли.
Типізований файл являє собою файл з компонент певного типу, які називаються записами.
Визначення типізованого файлу починається зарезервованими словами file of, після яких задається тип компонентів файла, описаний як звичайно, а за ним іде ідентифікатор попередньо визначеного типу файлів.
Приклад:
type
{ оголошення запису - типу компонент файла }
Student = record
Name:string[30];
Course:1..4;
Group:string[7];
End;
{ оголошення типізованого файлу }
data = file of student;
var
p: data; {типізований файл}
s: student;
Типом компонентів файла може бути будь-який тип, крім файлового (тобто не існує файлу файлів). Змінні типу файл не можна використовувати ні в операторах присвоювання, ні у виразах. Типізований файл є файлом прямого доступу, тобто, він дозволяє одночасно і читання і запис даних.
Для викладення подальшого матеріалу використаємо опис даних, наведений в останньому прикладі. Процедура read призначена читання даних з файла. Вона має такий формат:
read(f, n),
де f – ім’я файлової змінної,
n – ім’я змінної, в яку зчитуються дані з файла.
Тип змінної повинен відповідати типові компонент файла. Після виконання операції покажчик файла переміщується до наступного компонента. За один раз можна прочитати лише один елемент файлу.
Процедура write призначена для запису даних до файлу. Синтаксис процедури:
write(f, n),
де f – ім’я файлової змінної,
n – ім’я змінної, в яку зчитуються дані з файлу.
Тип змінної також повинен відповідати типові елементів файла. Після виконання операції покажчик файла також переміщується до наступного компонента.
Зауважимо, на відміну від вводу типізованих файлових структур не використовуються. Крім того, список параметрів відповідних процедур може містити лише одну змінну.
Приклад:
read(p,s);
write(p,s);
При відкритті файла покажчик завжди встановлюється на перший запис, який має номер 0. Для встановлення покажчика файла на потрібну позицію (для доступу до потрібного запису) призначена стандартна процедура seek. Синтаксис процедури:
seek(f,m),
де f – файлова змінна; .
m– змінна типу longint, яка задає номер запису.
Для визначення поточної файлової позиції використовується функція filepos типу longint, яка має такий синтаксис:
filepos(f),
де f – змінна файлового типу.
Для того, щоб визначити довжину файла в записах, використовується функція filesize типу longint, яка має такий синтаксис:
filesize(f),
де f – змінна файлового типу.
Приклад:
begin
reset(p); {відкриваємо файл}
read(p,s); {читаємо перший запис}
n:=filesize(p); {взнаємо кількість записів файла}
seek(p,n); {встановлюємо покажчик на кінець файла}
write(p,s); {дописуємо в файл новий запис}
…
end.
У мові реалізовані такі стандартні функції, призначені для опрацювання файлів. Функція eof - логічна, результат якої дорівнює true, якщо покажчик файла знаходиться наприкінці дискового файла, тобто за останнім компонентом файла. Якщо покажчик файла знаходиться в іншому місці, то результат функції буде дорівнює false .
Приклад:
begin
reset(p); {відкриваємо файл}
while not eof(p) do {поки є записи у файлі}
begin
read(p,x); {читаємо черговий запис }
writeln(x.name); {друкуємо прізвище студента}
end;
…
Завдання 2.1. Записати програму створення типізованого файлу.
program create;
type
student = record
Name:string[30];
Course:1..4;
Group:string[7];
end;
data = file of student;
var
p: data; {типізований файл}
x: student; {поточна змінна для запису даних у файл}
begin
assign(p,’my_file.dat’);{зв’язуємо файлову змінну з дисковим файлом}
rewrite(p); {відкриваємо файл}
{починаємо введення даних, завершення вводу – порожній рядок}
writeln(‘введіть прізвище студента або порожній рядок для завершення вводу’)
readln(x.name);
while x.name<>’’ do
begin
writeln(‘введіть курс студента’)
readln(x.course);
writeln(‘введіть навчальну групу студента’)
readln(x.group);
write(p,x); {записуємо дані до файлу }
writeln(‘введіть прізвище наступного студента або порожній рядок для завершення вводу’)
readln(x.name);
end;
close(p);
end.
25 26 27 28 Наверх ↑