2. 1. ФАЙЛОВА СИСТЕМА В PROLOG
Файл може бути відкритий:
для читання;
для запису;
для додавання;
для модифікації.
Файл, відкритий для будь-якої дії, відмінної від читання, повинен бути закритий
після завершення операції. В іншому випадку внесені до файлу зміни можуть бутипісля завершення операції. В іншому випадку внесені до файлу зміни можуть бути
втрачені. Можна відкрити кілька файлів одночасно. При цьому введення і виведення
можуть бути швидко перепризначені між відкритими файлами.
Вбудовані альтернативи домену file:
keyboard Читання з клавіатури (за замовчуванням)
screen Запис в монітор
stdin Читання зі стандартного вводу
stdout Запис в стандартне виведення
stderr Запис на стандартний пристрій для виведення помилок
3. 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 повідомить про помилку.
4. 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 або предикати для доступу
до двійковим файлів,
5. 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 присвоїть їй ім'я поточного активного пристрою запису.
7. 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.
9. 2. РОБОТА З ФАЙЛАМИ
Предикат eof / 1
перевіряє, чи є позиція, отримана в процесі читання, кінцем файлу. У цьому випадку
eof успішний. В іншому випадку - неуспіх.
Предикат eof має вигляд:
eof (SymbolicFileName)% (i)
eof видає помилку під час виконання, якщо файл був відкритий з правами тільки на
запис.
Зверніть увагу, що предикат не надає особливого значення символу кінця файла
DOS (комбінація клавіш <Ctrl> + <Z>).DOS (комбінація клавіш <Ctrl> + <Z>).
Приклад, як предикат eof можна
використовувати для визначення
предиката repfile, який корисний при роботі з
файлами, repfile генерує точку овернення до тих
пір, поки не буде досягнуто кінець файлу.
11. 2. РОБОТА З ФАЙЛАМИ
Предикат flush / 1
записує вміст внутрішнього буфера в іменований файл. Має формат:
flush (SymbolicFileName)% (i)
Він же запитує систему "скинути всі буфери".
Предикат existfile / 1
виконується успішно, якщо файл ОSFileName буде знайдений. Формат його наступний:
existfile (OSFileName)% (i)
Предикат OSFileName може містити каталог, а саме ім'я може містити знакиПредикат OSFileName може містити каталог, а саме ім'я може містити знаки
підстановки, як c: psys *. cfg. Предикат existfile завершується неуспішно, якщо ім'я
файлу не знайдено в позначеному шляху каталогу. Проте, незважаючи на те, що existfile
знаходить всі файли, включаючи файли з встановленими атрибутами "system“ і "hidden“,
він не знаходить каталоги. Це може бути виконано використанням предикатів пошуку
каталогів.
Для перевірки того, що файл присутній на диску (перш ніж відкривати його), ви
можете скористатися:
12. 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
13. 3. УПРАВЛІННЯ ТЕРМАМИ
Предикат readterm дозволяє отримати доступ до фактів у файлі. Він може зчитати будь-
які об'єкти, записані предикатом write, і має вигляд: readterm (<name>, TermParam), де
<name> - ім'я домену.
14. 3. УПРАВЛІННЯ ТЕРМАМИ
Visual Prolog створює одну доменну альтернативу для кожного предиката з розділу facts. Пролог
описує кожен предикат бази фактів за допомогою функтора і доменів аргументів цього предиката.
Наприклад, для такого оголошення розділу facts:
Visual Prolog
згенерує: