В системе Турбо-Пролог имеются следующие предикаты для работы с файлами:
deletefile уничтожение файла
save сохранение файла
renamefile переименование файла
existfile тест на наличие файла с данным именем
flush сброс данных из внутреннего буфера
disk выбор дисковода и пути доступа
dir выдача каталога директории
Кратко опишем, как работают предикаты для работы с файлами. В приведенных ниже примерах file _ domain является описываемым пользователем файловым доменом (как это сделать, будет пояснено в следующем разделе), a DOS_filename — именем, под которым файл фигурирует в директории на диске. В том случае, если пример не очевиден, он снабжается пояснениями.
- de1etefile(DOS_filename).
- save(DOSfilename). Сохраняет на диске утверждения динамической базы данных.
- renamefile(Old _ DOS _ filename,New _ DOS _ filename).
- existfile(DOSfilename). Предикат успешен в случае, если файл с именем, заданным переменной DOSfilename, присутствует в директории.
- flush(file _ domain). Этот предикат сбрасывает содержимое внутреннего буфера, отведенного для данного устройства записи.
- disk(Path). Если переменной Path присвоен корректный путь доступа, то заданная с его помощью директория становится текущей. Если же переменная Path не означена, то данный предикат присваивает Path путь доступа к текущей директории.
- dir(Path,Filespec,Filename). Переменной Path должен быть присвоен корректный путь доступа, переменная Filespec задает расширение представляющей интерес группы файлов. Данный предикат выдает каталог имен файлов с заданным расширением; вы можете выбрать среди них нужный и нажать Enter. Имя файла будет присвоено переменной File _ name.
Помимо перечисленных предикатов Турбо-Пролог также поддерживает предикаты чтения из файла, записи в файл, модификации файла и тому подобные. Эти предикаты будут рассмотрены позднее.
Описание файлового домена
Для того чтобы использовать в программе файлы, необходимо снабдить ее описанием файлового домена. Описание одного файлового домена с именем datafile выглядит как
file = datafile
Это описание бросается в глаза, так как не похоже на описания доменов других типов. Куда более привычным кажется описание типа
name = symbol
где name является именем домена, a symbol — стандартным типом доменов Турбо-Пролога. При описании файловых доменов, однако, тип домена file задается по левую сторону от знака равенства, а имя домена datafile — по правую.
Символическое имя файла типа datafile из настоящего примера есть идентификатор, который в программе может быть логически отождествлен с DOS-овским именем файла (именем, которое можно видеть при выдаче каталога директории). Это символическое имя называют также логическим именем файла.
В описании file можно указывать несколько символических имен, но само описание должно быть единственным. Если в программе вводится несколько символических имен файлов, то они разделяются между собой точкой с запятой (;):
file = datafilel; datafile2; datafile3
Это объявление декларирует 3 символических имени для последующего их отождест-вления с реальными файлами DOS.
Запись в файл
Перед тем как начать писать что-либо в файл, нужно сначала создать его. В Турбо-Прологе файлы создаются при помощи предиката openwrite. Опишем последовательность использования предиката openwrite и других действий, необходимых для записи в файл информации:
1. Открытие файла. Предикат
openwrite(datafile1,"FILE1.DAT").
где datafilel есть введенный пользователем файловый домен, а FILE1.DAT — имя файла в DOS, устанавливает связь между объектами datafilel и FILE1.DAT. Теперь ссылки на datafilel будут означать обращение к FILE1.DAT. Связь остается в силе вплоть до закрытия файла.
Заметим, что если файл с именем FILE1.DAT к моменту вызова предиката openwrite уже присутствовал в директории, то его содержимое будет утрачено. Для того чтобы застраховаться от этой неприятности, можно сначала проверить наличие файла при помощи предиката
existfile("FILEl.DAT")
и принять соответствующие меры, если existfile будет успешен.
2. Назначение файла в качестве устройства записи. Данную операцию проделает предикат
writedevice(datafile1).
3. Сама запись в файл. Можно использовать любые подходящие для этой цели предикаты, например write или writef. Любой предикат write будет теперь выводить информацию не на экран, а в файл.
4. Использование любых других предикатов и правил, отвечающих назначению программы. Примером может служить переадресация потока данных с экрана на принтер.
5. Закрытие файла. Этой цели служит предикат
closefile(datafile).
Когда файл закрыт, операции чтения или записи для него недопустимы. Закрытие файла также защищает содержимое файла от каких бы то ни было манипуляций; теперь возможны лишь операции с файлом в целом.
Еще одним следствием закрытия файла является перевод указателя файла в начало. Это может понадобиться при повторном открытии файла.
Ниже приведен пример фрагмента программы на Турбо-Прологе, поясняющий только что сказанное.
openwrite(datafile1,"FILE1.DAT"),
writedevice(datafile1),
< любые правила или предикаты записи в файл >
< любые другие правила или предикаты >
closefile(datafilel).
Чтение из файла
В случае если файл FILE1.DAT уже существует, то с ним можно произвести целый ряд операций. Можно считать из файла все содержащиеся в нем данные, можно считать данные выборочно, можно модифицировать их, а можно произвести дозапись новых данных в конец файла.
Для чтения данных из файла требуется:
1. Открытие файла
openread(datafile1,"FILE1.DAT")
2. Назначение файла устройством чтения
readdevice(datafile1).
3. Само чтение из файла при помощи соответсвующего предиката или правила.
4. Использование произвольных предикатов и правил, отвечающих целям программы.
5. Закрытие файла
closefile(datafile1).
Иллюстрацией может служить
openread(datafilel,"FILE1.DAT"),
readdevice(datafilel),
< любые правила или предикаты чтения из файла >
< любые другие правила или предикаты >
closefile(datafilel).