Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль - лекциии.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Файлова система.

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

Наприклад, якщо ми хочемо працювати з текстовим файлом Text.doc, то в програмі повинні бути наступні рядки:

{об'являємо файлову змінну f, вводимо логічний файл типу text}

Var f:text;

Begin

Assign(f, 'c:\text.doc');

{ця процедура зв'язує фізичний файл text.doc на диску С: з логічним файлом f}

end;

Після цього всі звернення до файлу на диску будуть виконуватися через файлову змінну f. Логічні файли уніфіцирують роботу з файлами, дозволяючи працювати не безпосередньо з пристроями машини, а з їх логічними позначеннями.

Фізичні файли.

Все що являється файлом в MS-DOS являється фізичним файлом в ТР. Визначається фізичний файл рядком з його ім'ям. Імена можуть бути рядковими константами або зберігатися у рядкових змінних. Ім'я файлу на диску може мати адресну частину. ‘С: \PAS\Test.PAS’

Інший різновид фізичних файлів - це пристрої MS-DOS. MS-DOS не робить особливих відмінностей між традиційними файлами та пристроями. Пристрої мають свої фіксовані імена і багато в чому схожі з файлами. Ім'я пристрою, наприклад, може стати на місце імені файлу на диску при копіюванні.

Фізичні файли - це пристрої організовані як текстові файли. Для нормальної роботи їх треба зв'язати з текстовими логічними файлами. Не визначена така структура даних, як файл файлів в пам’яті. Будь-який об’явлений

логічний файл має зміст тільки після встановлення зв'язку з зовнішнім фізичним файлом. З файловою системою зв'язано поняття буферу введення-виведення. Буфер - це область пам'яті, що відводиться при відкритті файлу. При запису у файл вся інформація спочатку направляється в буфер і там накопичується до тих пір, поки весь об'єм буферу не буде заповнено. Тільки після цього або після спеціальної команди скидання буферу здійснюється передача даних по призначенню на диск або у порт. Аналогічно при читанні із файлу зчитується не стільки, скільки запитується, а скільки поміститься в буфері. Механізм буферізації дозволяє більш швидко та ефективно обмінюватися інформацією з різними пристроями. Для текстових і безтипових файлів можна встановлювати розмір буферу на свій розсуд.

Файлові типи.

Турбо Паскаль підтримує три файлових типи:

1. Текстовий; (тип text)

2. Компонентний (типу file of):

3. Безтиповий (типу file)

Текстові файли — це файли, що складаються з кодів ASCII, виключаючи розширені та керуючі коди. Ці файли організуються рядками і обов'язково містять кінець файлу.

Компонентні файли на відміну від текстових складаються з машинних представлень чисел, символів та структур, з них побудованих. Вони зберігають дані в тому самому вигляді, що і пам'ять ЕОМ. Тому засобами компонентних файлів можна здійснювати обмін даними тільки між дисками і робочою пам’яттю програми, але не можна, наприклад, напряму вивести дані на екран.

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

Принцип роботи з файлами один, хоч і є різниця у наборах команд для роботи з різними файловими типами. Для всіх без виключення файлів необхідне попереднє зв'язування їх файлових змінних з фізичними файлами.

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

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

1. Assign (Var f; FileName:String);- ця процедура встановлює зв'язок між логічним файлом, який описується файловою змінною f любого файлового типу і конкретним файлом MS-DOS, назва якого міститься у рядковому параметрі FileName. Рядок FileName може містити ім'я файлу на диску (в тому числі і повне ім'я файлу), ім'я стандартного пристрою MS-DOS (CON, PRN) або пустий рядок. Ім'я фізичного файлу повинно бути коректним і унікальним, не можна вставляти символи шаблонів (‘*’ ‘?’) в ім'я файлу. Сама процедура Assign не займається аналізом коректності імені файлу і безперечно зв'язує дане ім'я з логічним файлом f. Логічний файл при цьому вважається закритим, а розмір буферу не визначеним (якщо файл f зв'язаний з некоректним ім'ям, то це викличе помилку введення-виведення тільки при спробі виконати любу дію : відкрити файл або вилучити його). Будучи колись встановленим, зв'язок між файловою змінною f та фізичним файлом зберігається до наступного виклику Assign. Після того, як логічний файл зв'язаний з фізичним, його можна відкривати для читання та запису:

Reset(var f);- для читання

Rewrite(var f); - для запису.

Повторний виклик Reset повторить послідовність читання знову на самий перший елемент файлу, при цьому втрата даних виключена. А повторне звернення до Rewrite зітре поточний зміст файлу, та налагодить файл до заповнення з першого елементу.

2. Close (Var f); - закриває відкритий до цього логічний файл f. Спроба закрити вже закритий файл або невідкритий файл викликає збій програми (якщо ж програма перервалася через помилку і до закриття файлу, то він все ж таки буде створений на носії, але вміст останнього буферу не буде перенесено у файл).

3. Rename (Var f; NewName: string); - перейменування файлів. Перейменування файлів дозволяє перейменовувати фізичні файли на диску, зв'язані з логічним файлом f. Перейменування виконується тільки з закритим файлом, в протилежному випадку виникає збій. Після даної процедури можна знову відкривати файл, але f буде зв'язана вже з новим ім'ям. Неможна змінювати ім'я, змінюючи ім'я диску та шлях до файлу.

Наприклад:

Assign(Var f; 'A: \file. ааа ');

Rename(Var f; 'C:\file.bbb');

В другому операторі помилка, так як крім імені файлу змінюється і диск

на якому він знаходиться (перенесення не визначено в мові, це треба

конструювати засобами ТР).

4. Erase (Vаr f); - вилучення файлів. Ця процедура знищує фізичний файл на диску. Файлова змінна повинна бути попередньо зв'язана з існуючим фізичним файлом. Сам файл до моменту виклику Erase повинен бути закритим.

Приклад:

Assign(Var f; FileName);

Erase(Var f);

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

EOF(Var f):Boolean;

Вона повертає значення True, коли при читанні досягнутий кінець файлу. У всіх останніх випадках вона повертає значення False. Стан EOF відновлюється автоматично при кожному зверненні до процедури. Файл f при цьому повинен бути відкритим.