У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


але читання та запис за допомогою цього імені неможливі до наступного відкривання чи нового зв’язування з подальшим відкриванням.

Спроба закрити вже закриту або ще не відкриту файлову змінну призводить до аварійного завершення програми.

Таким чином, стандартний порядок дій із файловою змінною можна подати у вигляді

зв’ язування

відкривання

обробка

закривання

нове відкривання або зв’ язування та відкривання

обробка

закривання

тощо

Перш, ніж розглядати підпрограми відкривання та обробки файлів, розглянемо файлові змінні докладніше.

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

Елемент 1

Елемент 2

...

Елемент k

...

Елемент N

Номер доступного елемента в послідовності елементів файла є значенням спеціальної змінної. Вона не означається в Паскаль-програмі і явно не задається, але вона є й називається файловим вказівником (рис.13.1). Значення файлового вказівника та відповідно розташування доступного елемента в послідовності змінюється при виконанні підпрограм обробки файлів.

Основними діями при роботі з файлом є читання, тобто копіювання значення доступного елемента в "нормальні" змінні програми, та запис – копіювання значення в доступний елемент. Можливість читання та запису задається режимом доступу до файла, або його станом. Таким чином, в будь-який момент виконання програми файл перебуває в певному стані – читання, запису або чогось іншого.

Отже, значення файлової змінної складається з послідовності значень у фізичному файлі, номера доступного елемента та стану. Позначимо це у вигляді (F, i, s), де F – послідовність значень елементів <f0, f1, … , fn>, i – номер доступного елемента, s – стан. Нумерацію елементів ми починаємо з 0, тому що так вона починається в системі Турбо Паскаль. Стани читання та запису позначатимемо літерами R та W відповідно.

Приклад. Вираз (<11, 12, 13, 14>, 1, R) позначає значення файлової змінної, складене з послідовності чисел 11, 12, 13, 14, друге з яких (його номер 1!) можна прочитати. Зобразимо це значення так:

F

11

12

13

14

Стан

R

Стрілка вказує на доступний елемент, тобто є позначенням файлового вказівника.

Вираз (<11, 12>, 2, W)позначає файл із двох елементів:

F

11

12

Стан

W

Обидва вони недоступні, файл перебуває в стані запису, до нього можна додати новий елемент (із номером 2) і присвоїти йому якесь значення.

Вираз (<>, 0, R) позначає порожній файл, у якому немає елементів.з

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

І останнє зауваження. Елементи типізованих файлів можуть мати будь-який скалярний чи структурний тип, окрім файлового чи структурного з елементами-файлами. Файли також не можуть бути елементами інших структур. Наприклад, недопустимі означення типів

type FF = file of file of якийсь тип;{???}

FA = array [ 1..10 ] of file of якийсь тип; {???}

FAF = file of FA {???}.

2. Послідовний запис у типізовані файли

Перш, ніж записувати в файл, слід відкрити його для запису. Це задається процедурою REWRITE. Після виклику ReWrite(f) значення f подається як (<>, 0, W), тобто незалежно від попереднього значення f послідовність у файловій змінній стає порожньою:

F

стан

W

Значення 0 вказівника доступного елемента свідчить про те, що можна записати нове значення в перший, тобто з номером 0, елемент файла. Ця процедура викликається для створення нового файла або поновлення старого зі знищенням даних, що були в ньому. Після її виконання файл називається встановленим у початковий стан для запису.

Запис у файл задається процедурою WRITE. При виконанні її виклику

write ( f, вираз-типу-компонентів-файла)

обчислюється значення виразу та присвоюється доступному елементу файла, після чого вказівник доступного елемента зсувається на 1 елемент. Наприклад, після виконання останього з наведених операторів у програмі

program ...

var f : file of integer; x : integer

begin ...

rewrite(f); x:=2;

write(f, 1); write(f, x); write(f, x*x);

...

end.

файлова змінна f має значення, що подається як (<1, 2, 4>, 3, W).

Узагалі, значення (<f0 , … , fn-1>, n, W) файлової змінної f при виконанні write(f, вираз) міняється на (<f0, … , fn-1, V>, n+1, W), де V позначає значення виразу.

У виклику write можна вказувати довільне число аргументів-виразів того самого типу: write ( f, вираз1, ... , виразN ). Такий виклик виконується насправді як послідовність

write(f,вираз1); … ; write(f,виразN).

Наприклад, замість write(f, 1); write(f, x); write(f, x*x) можна написати write(f, 1, x, x*x).

Підкреслимо, що процедуру writeln не можна застосовувати до типізованих файлів. Вона призначена лише для роботи з текстами.

Приклад 13.1. Треба створити файл із такими даними про студентів групи: прізвище та ім’ я студента, а також середній бал його успішності.

Дані про студента можна подати записом типу

Student = record

SName, Name : string[20];

Ball : real

end.

Зв’ язування та встановлення файла в початковий стан для запису оформимо процедурою OpenFile, а створення – процедурою CreatFile у такій програмі:

program InPutGroup;

type

Student = record

Sname, Name : string[20];

Ball : real;

end;

var

Fi : file of Student; { Файлова змінна Fi – інформаційний файл }

FileName: string; { Змінна для введення імені файла }

procedure OpenFile;

begin

writeln('Задайте ім''я файла, що буде створюватися: ');

readln(FileName);

assign(Fi, FileName);

rewrite(Fi);

end;

procedure InPutFile;

var St : Student;

Ch : char;

begin

repeat

writeln('Задайте дані про студента:');

write('Прізвище>'); readln(St.SName);

write('Ім''я>'); readln(St.Name);

write('Середній бал успішності>'); readln(St.Ball);

write(Fi, St); {***}

write('Чи треба вводити дані про нового студента? "Y"/"N"> ');

readln(Ch);

until (Ch = 'n') or (Ch = 'N');

close(Fi);

end;

begin

writeln('Програма створення


Сторінки: 1 2 3 4 5 6