2 REWRITE(F) – створює і відкриває новий файл з ім'ям, пов'язаним із змінною F процедурою ASSIGN. Якщо файл з заданим ім'ям існує, він
знищується (стирається ) і замість нього створюється новий порожній файл. Якщо файл з таким ім'ям відкритий, він закривається, знищується і створюється заново. Покажчик поточної позиції файла встановлюється в початок порожнього файла (на ознаку кінця файла). Функції EOF(F) привласнюється значення TRUE.
3 WRITE(F,A) – записує значення змінної А у файл F на місце поточного компонента і просуває покажчик поточної позиції файла на наступний компонент. Змінна А повинна бути того ж типу, що і компонент файла. Якщо EOF(F)=TRUE, в кінець файла додається новий компонент. Інакше здійснюється заміна (коректування) поточного компонента.
4 RESET(F) – відкриває існуючий файл з ім'ям, пов'язаним із змінною F. Файл з таким ім'ям повинен існувати. Якщо файл вже відкритий, він спочатку закривається, а потім відкривається знову. Покажчик поточної позиції файла встановлюється в початкове положення.
5 READ(F,A) – прочитує з файла поточний компонент, привласнює його значення змінній А і просуває покажчик поточної позиції файла на наступний компонент. Змінна А повинна бути того ж типу, що і компонент файла. Якщо EOF(F)=TRUE, то при спробі читання виникає помилка. 6SEEK(F,n) – переміщає покажчик поточної позиції файла на компонент з номером n. Перший компонент файла має номер 0. Для переміщення на кінець файла можна використовувати процедуру Seek (F, FileSize (F)).
7CLOSE(F) – закриває відкритий файл, пов'язаний із змінною F.
При роботі з файлами можна використовувати наступні стандартні функції:
1 EOF(F) – повертає статус кінця файла. Результат функції TRUE
(істина), якщо покажчик поточної позиції файла знаходиться на ознаці кінця файла, тобто за останнім компонентом файла, і FALSE (брехня) – інакше.
2 FILESIZE(F) – повертає поточний розмір файла, тобто кількість компонентів у файлі. Якщо файл порожній, FileSize(F)=0.
3 FILEPOS(F) – повертає поточне значення покажчика файла. Якщо
поточне значення покажчика відповідає початку файла FilePos повертає 0, якщо кінцю файла (тобто EOF(F)=True), то FilePos(F) = FileSize(F).
Функцію EOF можна використовувати в умовному операторі IF або в операторі циклу WHILE. Для перевірки того, що файл не закінчений (готовність до читання), можна застосовувати, наприклад, наступну конструкцію:
while not EOF(F) do begin
...
READ (F,A);
...
end ;
У цій конструкції здійснюється послідовне читання (і обробка) компонентів файла до тих пір, поки покажчик поточної позиції указує на черговий компонент (тобто у файлі є ще не оброблені компоненти). Цикл завершиться, як тільки покажчик поточної позиції просунеться за кінець файла (тобто будуть оброблені всі компоненти файла).
На практиці дуже часто компонентами файла є записи.
Запис – це структурований тип даних, що складається з фіксованої кількості компонентів, які називаються полями. В одному полі дані мають один і той же тип, а в різних полях можуть мати різні типи. Тому записи називають комбінованими типами даних.
У записі кожне поле має своє ім'я (ідентифікатор). Кількість полів, тип і ідентифікатор кожного поля фіксуються у визначенні типа, до якого відноситься запис. Визначення починається з ключового слова RECORD, за яким слідує перелік всіх полів з вказівкою через двокрапку їх типів. Поля відділяються один від одного крапкою з комою. Поля запису можуть бути будь-якого типу. Якщо декілька полів мають один і той же тип, то імена полів можна перелічувати через кому і потім вказати загальний тип.
Завершує визначення типу запису ключове слово END.
Загальний вид опису типу-запису:
Type T=RECORD
I1:T1;
I2:T2;
...
IN:TN end;
Після введення типу запису можна задати змінні цього типу:
var A,B:T;
де T - ідентифікатор типу;
Ik - ім'я поля або список розділених комами імен полів;
Tk - типи полів;
А, В - ідентифікатори (імена) змінних типу запису.
Приклад. Запис має чотири поля: місто, вулиця, номер будинку і номер квартири, тобто запис є адресою. Тоді адресу можна визначити таким чином:
Type ADRES=RECORD
G,U:STRING[15]; D,K:integer end;
Запис типу DATA включає рік, місяць, день, описується таким чином:
Type DATA=RECORD
YEAR, MONTH, DAY:INTEGER
end;
Змінні А типу ADRES і D1,D2 типу DATA задаються таким чином: var А:ADRES; D1,D2:DATA;
Доступ до полів змінних типу запису здійснюється вказівкою імені змінної і імені поля, записуваного через крапку.
Наприклад, щоб заслати у визначену вище змінну А адреса: "м. Краматорськ, вул. Кришталева, будинок 52, кв.128", треба виконати наступні оператори привласнення:
А.G:=’Краматорськ’;
А.U:=’Кришталева’;
А.D:=52;
А.K:=128;
Для запису в змінну D1 дати 25.10.1996 р. слід виконати оператори:
D1.DAY:=25;
D1.MONTH:=10;
D1.YEAR:=1996;
Можна звертатися не тільки до окремого поля запису, але і до запису в цілому, використовуючи оператор привласнення. Наприклад, щоб переслати дату із змінної D1 в D2 можна виконати один оператор: D2:=D1
Дія цього оператора рівнозначна дії групи операторів:
D2.YEAR:=D1.YEAR;
D2.MONTH:=D1.MONTH;
D2.DAY:=D1.DAY;
Іншими словами, звернення до змінної типу запису – це звернення одночасно до всіх полів цієї змінної: виконання якихось дій над змінноюзаписом – це виконання даних дій над кожним її полем.
Для того, щоб не записувати кожного разу ім'я змінної при зверненні до полів запису, можна використовувати оператор над записами WITH. У цьому випадку можна указувати тільки поле змінної. Наприклад, для занесення в змінну А адреси замість наведеного раніше фрагмента програми можна використовувати наступний:
with А do begin
G:=’Краматорськ’;
U:=’Кришталева’;
D:=52; K:=128 end;
Тип запису можна вводити безпосередньо при визначенні змінних. Наприклад, визначити наведені вище змінні типу запису А, D1 і D2 можна так:
var А: record G,U:string[15]; D,K:integer end;
D1,D2:record
YEAR, MONTH, DAY:integer
end;
Як наголошувалося вище, поля запису можуть бути будь-якого типу, у тому числі записами або масивами, наприклад:
type STRUCT=record
FIO:string[13]; KOL:integer;
А:ARRAY[1.10] integer end;
У свою чергу, тип запису можна задавати не тільки для окремих змінних, але і для компонентів масиву. Іншими словами, можна визначати масиви, компонентами якого є записи. Наприклад, після введення вищенаведеного типу запису ADRES можна визначити наступну змінну типу
«масив» (для створення масиву адресів):
var MAS=ARRAY[1..20] ADRES;
Доступ до полів в цьому випадку здійснюється так, як мовилося вище. Проте в цьому випадку після імені змінної слід вказати ще і її індекс, наприклад:
MAS[7].G:='Краматорськ’;
MAS[7].U:=’Шкадінова’;
Використовування оператора WITH дозволяє спростити це звернення :
with MAS[7] do begin
G:='Краматорск’;
U:=’Шкадинова’;
end;
Скласти програму формування на магнітному диску телефонного довідника, кожний рядок (компонент) якого складається з наступних полів:
прізвище; ім'я; вулиця; будинок; квартира; телефон.У цій програмі передбачити друкування довідника осіб, прізвища яких починаються на задані букви.
При написанні цієї програми її краще розбити на дві. Перша призначена для введення даних та формування файла. Друга – виконує обробку файла.
Нижче наведено текст першої програми.
program lab5а; uses CRT;
Type ADRES=record
F,I,U:string[15];
D,K:integer; TEL:string[8]; end;
Type FIL1=file of ADRES; Var FF:FIL1; vv:integer;
A:ADRES; st:string[5];
{------------------------------------------------} begin assign (FF,'ADRESA.DAT');
{---------- Створення файла ---------------------} rewrite (FF); with А do repeat clrscr; write ('фамилия '); readln (F); if F <> '*' then begin
write ('имя '); readln (I); write ('улица '); readln (U); write ('дом '); readln (D); write ('квартира '); readln (K); write ('телефон '); readln (TEL); write (FF,A); end; until F='*'; close (FF) end.
Треба відмітити, що при кожному запуску цієї програми файл, створений при попередньому запуску програми, знищується і на його місці створюється новий. Таким чином, файл кожний раз формується заново. Дозапис в файл неможливий. Для забезпечення такої можливості треба замість процедури rewrite (FF); використати процедури:
reset (FF); seek(ff,FileSize(ff));
Але попередньо необхідно забезпечити створення файла, хай навіть пустого. Текст програми, що здійснює обробку файла наведено нижче.
program lab5а; uses CRT;
Type ADRES=record
F,I,U:string[15];
D,K:integer; TEL:string[8]; end;
Type FIL1=file of ADRES; Var FF:FIL1; vv:integer;
A:ADRES; st:string[5]; cc:char;
{------------------------------------------------} begin assign (FF,'ADRESA.DAT');
{------------- Обробка файла --------------------} repeat clrscr; write ('Введите перші символи або ''*''. '); readln (ST); if ST <> '*' then begin reset (FF); vv:=0; while not eof (FF) do begin read (FF,a); if (copy(A.F,1,length(ST))=ST) then begin with A do
writeln(F:15,' ',I:15,' ',U:15,' ',d:3,k:4,' ',TEL); vv:=vv+1; end end; writeln; if (vv=0) then
writeln('Нема прізвищ, що починаються з ',ST); writeln;
writeln ('Нажмите будь-яку клавішу');
CC:=ReadKey; end; until ST='*';
{-----------------------------------------------} close (FF) end.
Створити файл і виконати його обробку відповідно до табл. 13. Обробка полягає у виборі з файла і видачі на екран інформації, що вимагається. Варіанти структури файла наведені в табл. 14.