Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР5.docx
Скачиваний:
1
Добавлен:
19.11.2019
Размер:
29.78 Кб
Скачать

Методичні рекомендації

до виконання лабораторної роботи № 5

Тема: Робота с типізованими файлами.

Мета:

1. . Вивчення файлових типів в мові Турбо-Паскаль. Вивчення основних процедур роботи з типізованими файлами.

2. Отримання навиків в розробці програм роботи з типізованими файлами.

Короткі відомості із теорії

Доступ до файлів

В першу чергу при роботі з файлами необхідно привести у відповідність файлову змінну і ім'я файлу, з яким він зберігається на зовнішньому носієві. З цим ім'ям працює операційна система(ОС) DOS. Відповідність встановлюється за допомогою процедури:

ASSIGN (< ф.п.>, < ім'я файлу або л.у.>);

Тут < ф.п.> - файлова змінна; < ім'я файлу або л.у.> - це повне ім'я файлу, яке включає шлях доступу, безпосередньо ім'я файлу і розширення. "л.у". - стандартний логічний пристрій.

Наприклад:

ASSIGN (F1, 'a:\Tp5\DAT\St629.DAT');

ASSIGN (F2, 'Dannye.DAT').

Типизированные файлы

Компоненти цього файлу можуть бути наступних типів:

базового: byte, word, longint, integer, real, запис, char, string;

структурного; регулярного.

При цьому усі компоненти файлу має один і той же тип. Це означає, що довжина компоненти фіксована.

Оголошується такий файл в програмі таким чином:

Var

F1: File of byte;

F2: File of string[80];

F3: File of real;

. . .

F : File of RecFile;

Тут F1, F2, F3, F - це файлові змінні, які вказують на файли, компонеты яких відповідно являються типу byte, string, real і record.

Читання компонент файлу виконується процедурою:

Read(< ф.п.>, < список введення >);

Запис компонент у файл виконується процедурою:

Write(< ф.п.>, < список виводу >);

Приклад:

Var

X, Y: array[1.100] of integer; { масиви координат }

F : file of real;

i : byte;

Begin

. . .

< оператори по введенню 100 значень координат X, Y >

. . .

Assign(F, 'Coor.dat'); { файл створюватиметься в поточному каталозі }

ReWrite(F); { відкриття файлу для запису }

For i:= 1 to 100 do

Write(F, X[i], Y[i]); { запис координат у файл }

Close(F);

End.

У приведеному фрагменті програми координати записані послідовними парами X, Y. При такій організації файлу відбувається часте звернення до зовнішнього носія, це призводить до уповільнення роботи програми, що особливо помітно при роботі з великими об'ємами даних. Тому рекомендується дані записувати у файл і прочитувати з файлу великими блоками, приблизно кратними 512 байтам. Згідно з цим модифікуємо програму таким чином:

Type

Coord = array[1.100] of integer; { масиви координат }

. . .

Var 87

X, y: Coord; { масиви координат }

F : file of Coord; { файл регулярного типу }

i : byte;

Begin

. . .

< оператори по введенню 100 значень координат X, Y >

. . .

Assign(F, 'Coor.dat'); { файл створюватиметься в поточному каталозі }

ReWrite(F); { відкриття файлу для запису }

Write(F, X); { запис масиву координат Х у файл }

Write(F, Y); { запис масиву координат Y у файл }

Close(F);

End.

Тепер у файлі спочатку записано 100 координат Х, а потім 100 координат Y. Дані файлу ми записали двома великими блоками по 600 байтів кожен. Слід пам'ятати, що це не самий кращий спосіб організації файлу для даних прикладу, але досить зрозумілий. Прочитування координат з файлу виконується аналогічно, в програмі треба замість процедури REWRITE використовувати процедуру RESET, а замість пропозиції WRITE

використовувати пропозицію READ.

Дані, що добре структуруються, наприклад, дані про який-небудь об'єкт, зручно описувати типом "запис". В цьому випадку компонента файлу буде структурного типу.

Приклад:

Type

RecFile = record { запис даних по студентові }

Fam, Name, Otch : string[15];

GodR : word;

NGrup : string[10];

end;

Var

I : integer;

Buf : RecFile;

FilStud: file of RecFile;

Begin

Assign(FilStud, 'Stud.dat');

ReWrite(FilStud);

WriteLn('Введіть дані по студентах :');

For i:= 1 to 10 do { обмежимося 10 записами }

begin

{ інтерактивне введення даних }

Write('Прізвище : '); Readln(Buf.Fam);

Write('Ім'я : '); Readln(Buf.Name);

Write('По батькові : '); Resdln(Buf.Otch);

Write('Рік народження : '); Readln(Buf.GodR);

Write('N групи : '); Readln(Buf.NGrup);

{ запис даних у файл }

Write(FilStud, Buf); { Buf - звернення до усього запису }

end;

Close(FilStud);

End.

Читання компонент файлу, що типізується, можна здійснювати як послідовним, так і прямим методом доступу.

Послідовний доступ - це є доступ до компоненти файлу тільки після перебору усіх попередніх.

Прямий доступ - це є доступ відразу до вказаної компоненти.

Оскільки файли, що типізуються, мають компоненти фіксованої довжини, існує можливість організувати прямий доступ. Для організації прямого доступу до компонент файлу існують стандартні процедури Seek, FilePos, FileSize :

Seek(< файлова змінна >,< номер компоненти >);

FilePos(< файлова змінна >);

FileSize(< файлова змінна >).

Процедура Seek здійснює прямий доступ до будь-якої компоненти файлу.

Тут < номер компоненти > - позиція покажчика компонент файлу.

Вона може набувати наступних значень:

+ +1 - встановити покажчик на наступну компоненту;

- - 1 - встановити покажчик на попередню компоненту;

i - встановити покажчик на i -у компоненту.

Процедура FilePos визначає номер поточної позиції у файлі, а точніше номер поточної компоненти.

Процедура FileSize визначає розмір вказаного файлу - кількість компонент.

Нумерація компонент починається з нуля.

Приклад.

Type

RecFile = record { запис даних по студентові }

Fam, Name, Otch : string[15];

GodR : word;

NGrup : string[10];

end;

Var

i : integer;

Buf : RecFile;

FilStud: file of RecFile;

Begin

Assign(FilStud, 'Stud.dat');

Reset(FilStud);

i:= FileSize;

WriteLn('У файлі ', i, ' компонент');

Seek(FilStud, i - 1); { постали перед останнім записом }

Read(FilStud, Buf); { прочитали її }

{ можна її скоректувати і записати знову у файл }

Buf.GodR:= '1973';

{ перед записом треба знову встановити покажчик перед цією

записом }

Seek(FilStud, - 1);

Write(FilStud, Buf);

Close(FilStud);

End.

Примітка: Відкриваючи файл, що типізується, процедурою RESET, можна цей файл не лише читати, але і записувати в нього нову інформацію. При цьому файл повинен вже існувати на диску.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]