lect 5 prolog

Post on 09-Aug-2015

43 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

ФАЙЛИ: ЗАПИС ТА ЧИТАННЯ

Лекція 5

1. ФАЙЛОВА СИСТЕМА В PROLOG

Файл може бути відкритий:

для читання;

для запису;

для додавання;

для модифікації.

Файл, відкритий для будь-якої дії, відмінної від читання, повинен бути закритий після завершення операції. В іншому випадку внесені до файлу зміни можуть бути після завершення операції. В іншому випадку внесені до файлу зміни можуть бути втрачені. Можна відкрити кілька файлів одночасно. При цьому введення і виведення можуть бути швидко перепризначені між відкритими файлами.

Вбудовані альтернативи домену file:keyboard Читання з клавіатури (за замовчуванням)screen Запис в моніторstdin Читання зі стандартного вводуstdout Запис в стандартне виведенняstderr Запис на стандартний пристрій для виведення помилок

1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ

Предикат openread / 2

відкриває файл OSFileName для читання, використовуючи формат:

openread (SymbolicFileName, OSFileName) % (i, i)

Prolog звертається до відкритого файлу по символічному імені SymbolicFileName, оголошеному в домені file. Якщо файл не може бути відкритий, Prolog видасть повідомлення про помилку.

Предикат openwrite / 2

відкриває файл OSFileName для запису, використовуючи формат:відкриває файл OSFileName для запису, використовуючи формат:

openwritе (SymbolicFileName, OSFileName) % (i, i)

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

Предикат openappend / 2

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

openappend (SymbolicFileName, OSFileName) % (i, i)

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

1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВПредикат openmodify / 2

відкриває файл OSFileName і для запису, і для читання; якщо файл вже існує, він не буде перезаписаний, openmodify має формат:

openmodify (SymbolicFileName, OSFileName) % (i, i)

Якщо система не може відкрити OSFileName, Prolog повідомить про помилку. Для заповнення файлу з довільним доступом предикат openmodify може використовуватися разом зі стандартним предикатом filepos.

Предикат filemode / 2

При відкритті файлу в текстовому режимі предикат filemode встановлює вказаний При відкритті файлу в текстовому режимі предикат filemode встановлює вказаний файл в текстовий або двійковий режим, використовуючи формат:

filemode (SymbolicFileName, FileMode) % (i, i)

Якщо FileMode = 0, файл SymbolicFileName встановлюється в двійковий режим; якщо FileMode = 1, то він встановлюється в текстовий режим. У текстовому режимі при запису до нових рядків додаються символи "повернення каретки "/" переведення рядка ", а при читанні ця пара символів інтерпретується як новий рядок.

Carriage return (повернення каретки) = ASCII 13

Line feed (переклад рядка) = ASCII 10

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

1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ

Предикат closefile / 1

закриває вказаний файл; він використовує формат: closefile (SymbolicFileName)% (i)

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

Предикат readdevice / 1

перевизначає current_read_device (поточний пристрій читання) або повертає його ім'я. Предикат має формат:

readdevice (SymbolicFileName) % (i), (о)readdevice (SymbolicFileName) % (i), (о)

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

Предикат writedevice / 1

або призначає, або дозволяє отримати ім'я current_write_device (поточного пристрою запису). Він має формат:

writedevice (SymbolicFileName) % (i), (о)

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

1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ

2. РОБОТА З ФАЙЛАМИПредикат filepos / 3

може керувати позицією, де проводиться читання або запис. Має формат:

filepos (SymbolicFileName, FilePosition, Mode) % (i, i, i), (i, o, i)

Якщо FilePosition - пов'язана змінна, предикат може змінити позицію читання і запису для файлу з ім'ям SymbolicFileName. Якщо при виклику FilePosition є вільною змінною, то SymbolicFileName повертає поточну позицію у файлі. Значення SymbolicFileName належить типу long.

Mode FilePosition

Mode є цілою величиною і вказує, як має інтерпретуватися значення FilePosition:

0 Щодо початку файлу

1 Щодо поточної позиції

2 Щодо кінця файлу (кінець файлу

відповідає позиції 0)

Коли повертається FilePosition, то fileposповертає позицію щодо початку файлу незалежно від значення Mode.

2. РОБОТА З ФАЙЛАМИ

2. РОБОТА З ФАЙЛАМИ

Предикат eof / 1перевіряє, чи є позиція, отримана в процесі читання, кінцем файлу. У цьому випадку

eof успішний. В іншому випадку - неуспіх.Предикат eof має вигляд:

eof (SymbolicFileName)% (i)eof видає помилку під час виконання, якщо файл був відкритий з правами тільки на

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

DOS (комбінація клавіш <Ctrl> + <Z>).DOS (комбінація клавіш <Ctrl> + <Z>).Приклад, як предикат eof можна використовувати для визначення

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

2. РОБОТА З ФАЙЛАМИ

2. РОБОТА З ФАЙЛАМИ

Предикат flush / 1записує вміст внутрішнього буфера в іменований файл. Має формат:

flush (SymbolicFileName)% (i)Він же запитує систему "скинути всі буфери".

Предикат existfile / 1виконується успішно, якщо файл ОSFileName буде знайдений. Формат його наступний:

existfile (OSFileName)% (i)

Предикат OSFileName може містити каталог, а саме ім'я може містити знаки Предикат OSFileName може містити каталог, а саме ім'я може містити знаки підстановки, як c: \ psys \ *. cfg. Предикат existfile завершується неуспішно, якщо ім'я файлу не знайдено в позначеному шляху каталогу. Проте, незважаючи на те, що existfileзнаходить всі файли, включаючи файли з встановленими атрибутами "system“ і "hidden“, він не знаходить каталоги. Це може бути виконано використанням предикатів пошуку каталогів.

Для перевірки того, що файл присутній на диску (перш ніж відкривати його), ви можете скористатися:

2. РОБОТА З ФАЙЛАМИ

Предикат search file / 3

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

searchfile (PathList, Name, FoundName)% (i, i, o)

де PathList - це рядок, що містить один або більше шляхів, розділених «;», Name - ім'я шуканого файлу. Якщо файл знайдений, FoundName буде пов'язана з повним його ім'ям, інакше searchfile завершиться неуспішно. Наприклад:

SearchFile (".; ..; С: \ \", "autoexec.bat", FoundName),SearchFile (".; ..; С: \ \", "autoexec.bat", FoundName),

якщо autoexec.bat розташований в корені диска С:, FoundName встановиться рівним C: \ AUTOEXEC.BAT.

Файл може містити символи підстановки. У цьому випадку FoundName буде пов'язана з повним ім'ям файлу, що містить символи підстановки, і далі може бути використана як аргумент для предикатів пошуку каталогів. Наприклад, якщо ім'я файлу в попередньому прикладі задано як *. bat замість autoexec.bat, FoundNameвиявиться пов'язаним з С: \ *. ВАТ.

Предикат deletefile / 1

знищує файл, заданий його аргументом, і має формат:

deletefile (OSFileName)% (i)

Предикат deletefile дасть помилку, якщо не зможе видалити файл. OSFileName

3. УПРАВЛІННЯ ТЕРМАМИПредикат readterm дозволяє отримати доступ до фактів у файлі. Він може зчитати будь-

які об'єкти, записані предикатом write, і має вигляд: readterm (<name>, TermParam), де <name> - ім'я домену.

3. УПРАВЛІННЯ ТЕРМАМИVisual Prolog створює одну доменну альтернативу для кожного предиката з розділу facts. Пролог

описує кожен предикат бази фактів за допомогою функтора і доменів аргументів цього предиката. Наприклад, для такого оголошення розділу facts:

Visual Prolog

згенерує:

top related