Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
ВВОД И ВЫВОД
Как можно обмениваться информацией с файлами, а затем - вводить и выводить данные в разных форматах.
В прологе часто бывает ситуация, в которой программа взаимодействует с несколькими файлами. Она может, считывать данные из нескольких входных файлов, называемых также входными потоками, и выводить данные в несколько выходных файлов, называемых выходными потоками. В каждый момент выполнения пролог-программы лишь два файла являются "активными": один для ввода, другой - для вывода. Эти два файла называются текущим входным потоком и текущим выходным потоком соответственно.
Файлы могут обрабатываться только последовательно. Все файлы являются "текстовыми", т. е. файлами, состоящими из символов. Символы - это буквы, цифры и специальные знаки. О некоторых из них говорят, что они непечатаемые, поскольку, будучи выведенными на терминал, они не появляются на экране. Однако их присутствие может сказаться каким-либо другим образом, например, появятся пробелы или пустые строки.
Существуют два основных способа, с помощью которых файлы рассматриваются в Прологе в зависимости от формы записанной в них информации. Один способ - рассматривать символ как основной элемент файла. Соответственно один запрос на ввод или вывод приведет к чтению или записи одного символа. Для этой цели предназначены встроенные предикаты get, get0 и put (получить, получить0 и выдать) .
Другой способ рассматривать файл - считать, что в качестве основных элементов построения файла используются более крупные единицы текста. Такой естественной более крупной единицей является прологовский терм. Поэтому каждый запрос на ввод/вывод такого типа приведет к переносу целого терма из текущего входного потока или в текущий выходной поток соответственно. Предикатами для переноса термов являются предикаты read и write.
Встроенный предикат read(Х) используется для чтения термов из текущего входного потока.
Встроенный предикат write(Х) выводит терм.
Ввод и вывод в прологе организуется с помощью специальных предикатов чтения и записи. Перечислим наиболее часто используемые их этих предикатов:
readchar(Х) - считывает один символ с входного потока (по умолчанию, с клавиатуры) и присваивает его переменной Х;
readint(Х) - считывает целое число с входного потока и присваивает его переменной Х;
readln(Х) - считывает символы с входного потока до нажатия клавиши ввод. Введенные символы присваиваются переменной Х, которая должна быть строковой (string) или символьной (symbol);
readreal(Х) - считывает вещественное число с входного потока и присваивает его переменной Х;
write(Arg1, Arg2,...) - выводит значения аргументов в заданное активное окно на текущее устройство (по умолчанию, на экран дисплея). Аргументы Arg1, Arg2,... могут быть константами или переменными, которым заранее присвоены требуемые значения.
В предикате write можно использовать символы, начинающиеся со знака \. Они имеют специальные значения:
\k - символ, имеющий ASCII-код числа k;
\n - возврат каретки и перевод строки;
\t - табуляция.
По существу ввод и вывод в Прологе и в других языках мало различаются и реализуются довольно просто.
Пример. Вывести на экран номер телефона из списка.
predicates
reference(symbol, symbol)
goal
write("Ввведите имя :"),
readln(Name),
reference(Name, Phone),
write("Номер телефона - ",Phone).
clauses
reference("Андрей", "01-123456").
reference("Лена", "01-569767").
reference("Саша", "01-267400").
reference("Витя","01-191051").
В прологе файл может быть открыт: для чтения, записи, добавления и модификаций. Каждому открытому файлу ставится в соответствие логическое имя. Оно начинается со строчной буквы, должно быть объявлено в разделе domains и иметь тип file.
Четыре логических имени - printer, screen, keyboard и coml - зарезервированы и относятся соответственно к принтеру, экрану дисплея, клавиатуре и первому коммуникационному каналу.
Опишем часто используемые стандартные предикаты для работы с файлами:
openread (логическое имя файла, физическое имя файла) – файл с заданным физическим именем открывается для чтения, и ему ставится в соответствие логическое имя; например: openread (myfile, "prim. pro");
openwrite (логическое имя файла, физическое имя файла) - подобен openread, но файл открывается для записи;
openappend ( логическое имя файла, физическое имя файла) - подобен openread, но файл открывается для дополнения;
openmodify (логическое имя файла, физическое имя файла) - подобен openread, но файл открывается для модификаций (чтения и записи);
closefile (логическое имя файла) - файл с указанным логическим именем закрывается;
readdevice (логическое имя файла) - перераспределяет стандартный входной поток на файл с заданным логическим именем, который открывается для чтения;
writedevice (логическое имя файла) - перераспределяет стандартный входной поток на файл с заданным логическим именем, который открывается для записи или добавления;
file_str (физическое имя файла, str) - считывает данные из файла с указанным физическим именем и помещает их в str ( переменная str должна быть символьной или строковой). Символом конца файла является Ctrl-Z (ASCII-код26);
filepos (логическое имя файла, позиция, режим) - устанавливает текущий указатель на заданную позицию в указанном файле.
Объект, указывающий позицию, должен быть вещественного типа (real), а режим - целого типа (integer). Если на месте режима записан 0 (нуль), позиция отсчитывается от начала файла; если 1, - от текущего значения указателя; если 2, - от конца файла. Этот предикат используется для прямого доступа к файлу.
Рассмотрим пример:
Создать программу, которая ждет нажатия клавиши, а после нажатия записывает значение этого символа в файл 2.txt.
domains
file=f
predicates
vv
goal
vv.
clauses
wr:-write("vvedite symvol\n"),
openwrite(f,"1.txt"), /*открыть файл для записи*/
readchar(Simvol), /*считать символ*/
write(Simvol),
writedevice(f), /*открывается для записи или добавления*/
write (Simvol,"\n"), /*запись в файл*/
closefile(f). /*закрытие файла*/


