lect 5 prolog

14
ФАЙЛИ: ЗАПИС ТА ЧИТАННЯ Лекція 5

Upload: halyna-melnyk

Post on 09-Aug-2015

43 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Lect 5 prolog

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

Лекція 5

Page 2: Lect 5 prolog

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

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

для читання;

для запису;

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

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

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

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

Page 3: Lect 5 prolog

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 повідомить про помилку.

Page 4: Lect 5 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 або предикати для доступу до двійковим файлів,

Page 5: Lect 5 prolog

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 присвоїть їй ім'я поточного активного пристрою запису.

Page 6: Lect 5 prolog

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

Page 7: Lect 5 prolog

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.

Page 8: Lect 5 prolog

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

Page 9: Lect 5 prolog

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

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

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

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

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

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

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

Page 10: Lect 5 prolog

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

Page 11: Lect 5 prolog

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

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

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

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

existfile (OSFileName)% (i)

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

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

Page 12: Lect 5 prolog

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

Page 13: Lect 5 prolog

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

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

Page 14: Lect 5 prolog

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

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

Visual Prolog

згенерує: