Пример 3. Запись символов в файл myfile, который создается на текущем диске.
ВВОД И ВЫВОД ДАННЫХ В ТУРБО-ПРОЛОГЕ
Взаимодействие с файлами.
Ввод и вывод в Прологе организуется с помощью специальных предикатов чтения и записи, которые могут рассматриваться как аналоги соответствующих подпрограмм в языках Паскаль и Си.
В общем случае пролог- программа взаимодействует с несколькими файлами (в том числе с "псевдофайлом" keyboard (клавиатура) и "псевдофайлом" screen (экран)). Она считывает данные из нескольких входных файлов, называемых входными потоками, и выводит данные в несколько выходных файлов, называемых выходными потоками.
В каждый момент выполнения программы лишь два файла являются "активными": один для ввода, другой для вывода. В начальный момент эти два потока соответствуют терминалу. Текущий входной поток может быть заменен на другой файл name_of_file посредством цели
readdevice(name_of_file).
Такая цель всегда успешна (если только с файлом name_of_file все в порядке), а в качестве побочного эффекта происходит переключение ввода с предыдущего входного потока на файл name_of_file.
Пример 1. Использование предиката readdevice.
Приведенная ниже последовательность целей считывает информацию из файла myfile, а затем переключает ввод обратно на терминал.
...
openread(myfile,"myfile.txt"),
/* файл myfile открывается для чтения */
readdevice(myfile),
/* стандартный входной поток связывается с файлом myfile */
filepos(myfile,X,0),
/* текущий указатель устанавливается на позицию X, которая отсчитывается от начала файла myfile */
readchar(Y),
/* из позиции X читается символ и назначается переменной Y */
readdevice(keyboard),
/* стандартный входной поток связывается с клавиатурой */
...
Текущий выходной поток может быть изменен при помощи цели вида
writedevice(name_of_file).
Следующая последовательность целей выводит значение переменной X в файл outfile.txt и после этого перенаправляет последующий вывод обратно на терминал.
Пример 2.
...
openwrite(outfile,"outfile.txt"),
/* файл outfile открывается для записи */
writedevice(outfile),
/* стандартный выходной поток связывается с файлом outfile */
write(X),
closefile(outfile),
/* закрытие файла outfile */
writedevice(screen),
/* стандартный выходной поток связывается с экраном дисплея */
...
Кроме вышеупомянутых используются следующие стандартные предикаты работы с файлами:
1) openappend( логическое имя файла, физическое имя файла)
- подобен openread, но файл открывается для дополнения;
2) openmodify( логическое имя файла, физическое имя файла)
- подобен openread, но файл открывается для модификации (чтения и записи);
3) filepos( логическое имя файла,позиция,режим) - устанавливает текущий указатель на заданную позицию в указанном файле. Объект, указывающий на позицию, должен быть вещественного типа (real), а режим - целого типа ( integer ). Если режим равен 0, то позиция отсчитывается от начала файла; если 1, то - от текущего значения указателя; если 2, то - от конца файла. Этот предикат используется для прямого доступа к файлу.
4) readchar(Var) - считывает символ с входного потока ( по умолчанию с клавиатуры) и присваивает его переменной Var;
5) readint(Var) - считывает целое число и присваивает его переменной Var;
6) readln(Var) - считывает символы с входного потока до нажатия клавиши Enter. Введенные символы присваиваются переменной Var, которая должна быть строковой (string) или символьной (symbol).
7) readreal(Var) - считывает вещественное число;
8) write(Arg1, Arg2, ...) - выводит значения аргументов на текущее устройство (по умолчанию, на экран дисплея). Аргументы Arg1, Arg2, ... могут быть константами или переменными, которым заранее присвоены требуемые значения.
9) nl - вызывает перевод каретки в начало следующей строки.
В предикате write можно использовать символы, начинающиеся со знака \. Они имеют специальные значения:
\k - символы, имеющие ASCII код числа k;
\n - возврат каретки и перевод строки;
\t - табуляция.
Файлы могут обрабатываться только последовательно.
Каждый запрос на чтение из входного файла приводит к чтению в текущей позиции текущего входного потока. После этого текущая позиция будет перемещена на следующий, еще не прочитанный элемент данных. Следующий запрос на чтение приведет к считыванию, начиная с этой новой текущей позиции.
Запись производится точно так же: каждый запрос на вывод информации приведет к тому, что она будет присоединена к концу текущего выходного потока.
Пример 3. Запись символов в файл myfile, который создается на текущем диске.
Domains
file=myfile
/* объявляется логическое имя файла myfile */
predicates
read_in_loop
Goal
openwrite(myfile,"myfile.f"), writedevice(myfile), not(read_in_loop),
closefile(myfile), writedevice(screen),
write("\n запись в файл myfile.f произведена \n ").
Clauses
read_in_loop:- readchar(X), X<>'#',!, write(X), read_in_loop.
Дата добавления: 2016-05-05; просмотров: 839;