Пример 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; просмотров: 836;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.01 сек.