Использование файлов на внешнем носителе
ТП позволяет переадресовывать логические устройства ввода-вывода с помощью двух встроенных предикатов
readdevice
(СимвИмяФайла) (symbol)
: (i) (o)
Определяет или считывает символьное имя файла для устройства ввода.
(i) – связывает текущее устройство чтения с открытым файлом. Под СимвИменемФайла понимается символьное имя клавиатуоы либо симвоьное имя файла, открытого для чтения или модификации.
(o) – связывеат символьное имя файла с именем текущего устройства чтения, которое может быть клавиатурой или файла.
readdevice
(X) X=клавиатура
writedevice
(СимвИмяФайла) (symbol)
: (i) (o)
Определяет или считывает символьное имя файла для устройства вывода.
(i) – переназначает текущее устройство записи на открытый файл с именем СимвИмяФайла, который может быть одним из заранее определенных символьных имен (screen или printer) или имеет символьное имя, задаваемое пользоваетелем для файла, открытого для записи или модификации.
(o) – связывает параметр СимвИмяФайла с именем текущего устрйоства записи, которое может иметь имя screen, printer или символьное имя файла.
Описание файловых доменов
Для того, чтобы использовать в прграмме файлы, необходимо в раздел domains произвести описание файлового домена:
file = datafile
file – стандартный тип домена
datafile – символьное имя файла (логическое имя файла)
В файл описания логично указать несколько символьных имен, но само описание должно быть единственным.
file = df1;
df2; df3 % (; или)
Предикат ТП для работы с файлами
Удаление файлов
deletefile (ИмяФайлаДОС) (string) : (i)
Параметр ИмяФайлаДОС может создать имя накопителя, но не должен указывать путь.
deletefile
("C: progr.pro”)
Сохранение файла
save (ИмяФайлаДОС) (string) : (i)
Используется для записи на внешнйи накопитель динамической базы данных. После этого файо можно снова загрузить в ОП. Если заданный файл ИмяФайлаДОС уже существует, то его содержимое уничтожается.
Переименование файлов
renamefile (СтИмяФДОС, НовИмяФДОС) (string, string) : (i, i)
Проверка наличия файла
existfile (ИФД) (string) : (i)
Выполняется успешно, если заданный файл имеется в текущем каталоге.
Сброс данных из внутреннего файлового буфера в заданный файл
flash (СимвИФ) (file) : (i)
Позволяет организовывать передачу данных на стандартный интерфейс до того, как буфер будет заполнен.
Установка накопителя и пути
disc (ПутьДОС) (string) : (i) (o)
(i) – устанавливает путь и накопитель
(o) – связывает с параметром текущий накопитель и путь.
Вывод текущего каталога
dir (Путь, СпецификацияФайла, ИФД) (string, string, string) : (i, i, o)
Выдается каталог имен файлов в соответствии с заданными параметрами и присваивается 3-му параметру имя выбранного из каталога файла.
dir
("E:\PROLOG”, "a*.*”, X)
Открытие файлов
- для чтения : openread
- для записи: openwrite
- для чтения/записи : openmodify
- для заполнения (до записи) : openappend.
Формат этих предикатов одинаков: (СИФ, ИФД) (file, string) : (i, i)
Закрытие файла
closefile (СИФ) (file) : (i)
Для стандартных устройств (клава, экран, принтер) опции открытия и закрытия файла выполнять не нужно (автоматически).
Проверка на конец файла
eof (СИФ) (file) : (i)
Выполняется успешно, если указатель текущей позиции файла указывает на конец файла.
Установка или чтение типа файал
filemode (СИФ, тип) (file, integer) : (i, i) (i, o)
(i, i) – устанавливает тип файла ( 0 – текстовый, 1 – бинарный)
(i, o) – читает тип заданного файла и связывает его с параметром тип файла.
Устанвока или чтение позиции указателя файла
filepos (СИФ, Позиция, Режим) (file, real, integer) : (i, i, i) (i, o, i)
(i, i, i) – устанавливает указатель данного файла на заданню позицию (Режим=0 – относительно начала файла, =1 – текущей позиции, =2 – конца)
(i, o, i) – определяет позицию указателя относительно начала файла.
Чтение строки из файла
file_str (ИФД, Строка) (string, string) : (i, o) (i ,i)
(i, o) – читает строку из заданного файла и связывает ее с параметрм строка.
(
Максимально допустимый размер строки 64 кБайта. Признаком конца строки является символ Ctrl-Z (126).
Запись в файл
Последовательность действий, необходимая для записи в файл:
1. Открытие файла с помощью предиката openwrite. Если файла с указанным именем нет, то создаетс яновый файл. Если файл уже есть, то его содержимое будет утрачено. Чтобы от этого застраховаться, можно сначала проверить наличие файла предикатом existfile, и принять соответствующие меры, если existfile будет успешным.
2. Назначение файла в качнстве устройства записи предиката writedevice.
3. Самма запись в файл write или writef.
4. Использование любых других предикатов и правил, отвечающих назначению программы.
5. Закрытие файла предикатом closefile.
/* Вывод информации на экран дисплея в файл на диск */
domains
str = string
file = datafile
predicates
data (str)
write_lines
goal
openwrite (data, "a1.dat”),
write_lines,
closefile (datafile)
clauses
data ("aaaa”).
data ("bbbb”).
data ("cccc”).
. . . . . . .
write_lines:- data (Line),
write (" ", Line), nl,
writedevice (screen),
fail,
write_lines.
/* Считывание данных с клавиатуры и запись их в файл */
domains
file = datafile
kstr, fstr = string
predicates
readin (kstr, fstr) % чтение-запись
create_file
goal
create_file
clauses
create_file:- nl, nl,
write ("Введите имя файла”),
nl, nl, readln(FileName),
openwrite (datafile),
writedevice (datafile),
readln (Kstr),
concat (Kstr, "\13\10”, Fstr),
readin (Kstr, FStr),
closefile (datafile).
readin (_, Fstr):- write (FStr), readln (KStr1),
concat (KStr1, "\13\10”, Fstr1),
readin (Kstr1, Fstr1).
Дружественные пользователю программы для обработки файлов
Рассмотренные ранее программы рассчитаны на минимальное взаимодействие пользователя во время работы. Желательно включать модули, которые при работе программы оказывают пользователю помощь. Пример дружественной программы ниже.
/* ввод данных с клавиатуры и запись их на диск */
domains
file = datafile
kstr, fstr = string
predicates
write_message1
check_for_ready
give_instruction
process_input_output
process_file
write_message2
readin (kstr, fstr)
create_a_file
goal
create_a_file
clauses
create_a_file:- write_message1,
process_file, write_message2, nl, nl,
write ("Нажмите любую клавишу”),
readchar (_), exit.
write_message1:- nl, write ("Эта программа вводит данны с клавиатуры "), nl,
write ("Вывод в файл”), nl.
process_file:- check_for_ready, give_instruction,
process_input_output.
check_for_ready:- write ("Нажмите клавишу”),
write ("Программа готова к вводу данных”), nl, readdevice (keyboard),
readchar (_).
give_instruction:- nl,
write ("Данные вводятся с клавиатуры”), nl,
write ("Наберите
stop”), nl.
process_input_output:- write ("Введите имя файла”), nl,
readln (Filename), nl,
write ("Программа готова принять первую из вводимых строк”),
openwrite (datafile, Filename), writedevice (datafile),
readln (Kstr), concat (Kstr, "\13\10”, FStr),
readin (Kstr, Fstr), closefile (datafile).
write_message2:- writedevice (screen), nl,
write ("Данны записаны на диск”), nl
write ("Работа программы завершена”).
readin ("Stop”, _):- !.
readin (_, Fstr):- write (Fstr), readln (Kstr),
concat (Kstr1, "\13\10”, Fstr1),
writedevice (datafile),