Смекни!
smekni.com

Паскаль робота з файлами (стр. 1 из 4)

ПАСКАЛЬ: РОБОТА З ФАЙЛАМИ

1. Фізичні файли та файлові змінні

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

- це будь-який із різноманітних типів висувних шухляд, полиць, коробок тощо, як правило, з металевим стержнем для тримання паперів разом і в порядку так, щоб їх легко було відшукати;

- це ряд людей або речей, розташованих одне за одним.

Автори операційної системи MS DOS називають файлом іменовану область на зовнішньому носії інформації, наприклад, на дискеті. Ця область містить якусь інформацію, наприклад, програму чи вхідні дані до неї. Але як обробку цієї області задавати в Паскаль-програмі? На це питання ми спробуємо відповісти. Принаймні частково й на прикладі системи Турбо Паскаль.

Система програмування Турбо Паскаль, як і інші, має в своєму складі цілий набір засобів роботи з файлами – систему введення-виведення. Мова Паскаль не має операторів, якими описується обробка файлів. Уся обробка задається за допомогою підпрограм і змінних, зібраних у кілька бібліотек, або модулів. Наприклад, нам уже відомі такі процедури, як readln і writeln.

Почнемо уточнювати поняття файла. Як область на зовнішньому носії інформації, кожний конкретний, фізичний файл є послідовністю байтів. Але одну й ту саму послідовність байтів можна розглядати та обробляти і як послідовність байтів, і як послідовність значень якогось типу, і як послідовність символів, розбиту на рядки (інша справа, що за значення чи рядки ми при цьому одержимо).

У Паскаль-програмі файл позначається ім’ ям файлової змінної, тобто вона служить представником файла у програмі. Тип у її означенні задає спосіб, у який розглядається та обробляється файл. Далі будемо називати області на зовнішніх носіях фізичними файлами, а під словом "файл" розуміти саме файлові змінні. У мові Турбо Паскаль є три основні різновиди файлових змінних: типізовані файли, тексти та нетипізовані файли. Оглянемо їх.

Типізований файл розглядається як послідовність змінних деякого типу, заданого в означенні файлової змінної. Її тип задається виразом вигляду

file ofтип.

Наприклад,

var Fi, Fo : file of word;

FF : file of real;

або

type Student = record

Name : String;

Number : Integer;

end;

StGroup = array [1..25] of Student;

var Fi, Fo : file of StGroup;

Отже, значеннями елементів типізованого файла є значення відповідного типу, наприклад, word, real чи StGroup.

Текст у загальному розумінні – це послідовність символів, розбита на рядки. Рядок у загальному розумінні – це послідовність символів із явно позначеним кінцем. У мові Турбо Паскаль для файлів-текстів означено спеціальний тип із ім’ ям TEXT. Наприклад, можна означити

var Fi, Fo : text;

Підкреслимо, що хоча елементами тексту є символи, цей тип відрізняється від типу file of char. У текстах є спеціальні символи, якими задаються кінці рядків і навіть кінець тексту. Їх обробка відрізняється від обробки решти символів і задається спеціальними підпрограмами, незастосовними до файлів типу file of char, наприклад, readln і writeln.

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

var Fi, Fo : file.

Для них означено свої підпрограми читання й запису файлів.

Підкреслимо, що наведені три види файлів відрізняються не стільки можливим змістом їх змінних, скільки наборами підпрограм введення-виведення, застосовних до них.

Практично всі підпрограми першим параметром мають ім’ я файлової змінної. Далі ім’ я f буде позначати, як правило, саме файлову змінну. Хоча ніхто не заважає давати файловим змінним зовсім інші імена, наприклад, filevariable чи inpfil тощо.

Робота з файловою змінною починається зі зв’язування її імені з конкретним фізичним файлом. Для цього ідентифікатор файлової змінної та ім’я фізичного файла в операційній системі, або зовнішнєім’я, задаються у виклику процедури ASSIGN, наприклад,

assign ( f, 'myfile.dat' ).

Другий аргумент, зовнішнє ім’я, задається виразом типу string(рядок). Наприклад, якщо рядки s1 і s2 мають значення 'c:\mydir\book' та 'txt', то

assign(f, s1 + '.' + s2);

задає зв’язування з файлом c:\mydir\book.txt.

Файлові змінні з іменами INPUT і OUTPUT зв’ язуються неявно, тобто без указання в програмі, зі стандартними файлами введення й виведення– клавіатурою та екраном комп’ ютера. Їх ще називають стандартними пристроями введення-виведення. Означати явно імена input і output та зв’ язувати їх із іншими фізичними файлами не заборонено, але ми цього не рекомендуємо. Вони також можуть не вказуватися у викликах інших підпрограм обробки файлів. У розділі 2 ми вже розглядали найпростіші дії з клавіатурою та екраном.

Приклад. Нехай виконується програма з такими означеннями та операторами:

var f : text;

fn, st : string;

begin

fn := 'default.dat'; {default - "за узгодженням"}

write ('Якщо Ви натиснете ENTER, f буде ');

writeln ('зв''язано з "default.dat". ');

writeln ('Для зміни зв''язування f введіть ім''я файла:');

readln ( st );

if st <> '' then fn := st;

assign ( f, fn );

end.

Якщо користувач бажає зв’ язати ім’ я f із файлом, зовнішнє ім’ я якого default.dat, то йому достатньо лише натиснути на клавішу Enter. Якщо йому треба задати інше зв’ язування, то він має набрати на клавіатурі ім’ я фізичного файла, наприклад, newname.dat, і натиснути на Enter.-

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

Тут ми опишемо лише закриванняфайла, що задається процедурою СLOSE:

close ( f ) .

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

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

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

зв’ язування

відкривання

обробка

закривання

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

обробка

закривання

тощо

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

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

Елемент 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 = fileoffileof якийсь тип;{???}

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