Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц по Visual Prolog.doc
Скачиваний:
4
Добавлен:
02.05.2019
Размер:
937.47 Кб
Скачать

9.3. Організація файлу та методи доступу до файлу

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

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

Кожен з методів вимагає своїх предикатів відкриття файлу.

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

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

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

9.4. Робота з файлами різними методами доступу

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

Для читання або запису можна відкрити декілька файлів, але активним в певний момент часу може бути тільки один файл для запису, той що призначено на вихідний потік і один файл для читання, той що призначено для вхідного потоку.

Відкриття файлів для утворення файлу послідовним методом доступу

Предикат openwrite (Симв_ім'я, Ім'я_файлу_в_ОС) використовують для послідовного запису і перезапису файлу.

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

Утворення файлу послідовним методом доступу

Розглянемо на прикладі програми, які дії виконують при утворенні файлу послідовним методом доступу.

Завдання. Ввести компоненти файлу з клавіатури і записати їх у файл (утворення файлу).

Domains

File = f

Predicates

Do

repeat

do1

Goal

openwrite (f, ”F.dat” ), writedevice (f), do, closefile (f).

Clauses

Repeat.

Repeat: - Repeat.

Do: - repeat, readln (Y), do1(Y),Y=””.

Do1(Y):- Y= “”;

Write(Y).

Процедура виконує дії:

  • відкриває файл для запису послідовним методом доступу;

  • призначає вихідний потік на файл;

  • вводить компоненти з клавіатури;

  • записує компоненти у файл;

  • По закінченню компонент файл закривається.

Ввід виконується до введення ознаки кінця вводу(порожній рядок).

Відкриття файлів для читання файлу послідовним методом доступу

Предикат Openread (Символічне ім'я, Ім'я_файлу_в_ОС) використовують для послідовного читання існуючого файлу. Покажчик на компоненту файла встановлюється в нульове положення.

Читання файлу послідовним методом доступу

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

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

Предикат EOF (Символічне ім'я) перевіряє на досягнення позиції кінця файлу.

Завдання. Прочитати компоненти файлу і вивести їх на екран.

Domains

File = f

Predicates

Do

Goal

openread (f, ”F.dat” ), readdevice (f), do, closefile (f).

Clauses

Do: - eof (f);

readln (Y), write(Y), do.

Процедура виконує дії:

  • відкриває файл для читання послідовним методом доступу;

  • призначає вхідний потік на файл;

  • читає компоненти до введення ознаки кінця файлу;

  • виводить компоненти на екран;

  • закриває файл.

Дозапис файлу послідовним методом доступу

Предикат openappend (Символічне ім'я, Ім'я_файлу_в_ОС) – використовують для дозапису файлу послідовним методом доступу. Покажчик в файлі установлюється на кінець файлу (ознаку eof).

Наприклад: openappend (f, ”F.dat” )

Дії, що виконуються при до запису аналогічні діям при запису у файл.

Робота з файлом прямим методом доступу

Відкриття файлу для прямого методу доступу

Предикат openmodify (Символічне ім'я, Ім'я_файлу_в_ОС) використовують для відкриття файлу прямим методом доступу, як для запису, так і для читання.

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

Domains

file = f

Predicates

Do

Goal

Do.

Clauses

do:- openwrite (f, ”F.dat”), closefile(f), openmodify(f, “F.dat”),….

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

Встановлення покажчика файлу для прямого доступу до компоненти

При прямому методу доступу до компонент файлу використовують стандартний предикат filepos.

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

filepos (Символічне ім'я файлу, Покажчик, Точка відліку)

Режими роботи предикату:

( i, i, i) – встановити покажчик

(i, o, i) – одержати поточний покажчик

(symbol, long, integer)

Точка відліку може приймати значення:

0 – точка відліку покажчика початок файлу

1 – точка відліку покажчика поточний покажчик

2 – точка відліку покажчика кінець файлу.

Для режиму 2 покажчик, який не дорівнює 0 вказує на байт поза файлом. Рахунок байтів зліва на право.

Читання компоненти файлу прямим методом доступу

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

Завдання: Прочитати 31 символ файлу прямим методом доступу і вивести його на екран.

Do: - openmodify(f, “F.dat”), readdevice(f),filepos (f, 30, 0), readchar (C),

write(C), closefile(f).

Процедура виконує дії:

  • відкриває файл для прямого методу доступу;

  • призначає вхідний потік на файл;

  • встановлює покажчик у необхідні позицію;

  • читає символ;

  • виводить символ не екран;

  • закриває файл.

Покажчик встановлюється на 31 байт файлу(рахунок ведеться з нуля).

Запис компоненти у файл прямим методом доступу

Розглянемо на прикладі програми, які дії виконують при запису компоненти у файл прямим методом доступу.

Завдання. Записати у 21 байт файлу прямим методом доступу символ ‘Y’. Файл не існує.

Do:- openwrite(f, “F.dat”), closefile(f), openmodify(f, “F.dat”), writedevice(f),filepos (f, 20, 0), write(‘Y’),closefile(f).

Процедура виконує дії:

  • Процедура утворює порожній файл:

    • Відкриває файл для запису послідовним методом доступу;

    • Закриває файл.

  • Відкриває файл для прямого доступу;

  • призначає вихідний потік на файл;

  • Утворює 20 байтів з пропусками і встановлює покажчик після 20 байту для запису;

  • Записує символ в файл;

  • Закриває файл.

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

Предикат filepos можна використати для знаходження довжини файлу в байтах.

Завдання. Визначити довжину файлу в байтах.

do:-openmodify(f,“f.dat”),readdevice(f),

filpos(f,0,2),filpos(f,D,0),write(D),closefile(f).

Процедура виконує дії:

  • Відкриває файл для прямого доступу;

  • Призначає вхідний потік для читання;

  • Перший предикат filepos встановлює покажчик на останній байт файлу включаючи керуючі символи;

  • Другий предикат filpos визначає на якій відстані в байтах стоїть перший символ файлу відносно початку, тобто довжину файла в байтах;

  • Виводить довжину на екран;

  • Закриває файл.