Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РЛП.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
681.47 Кб
Скачать

11 Файлы

Файлом называют именованную совокупность данных, записанных на диске. Файл состоит из компонентов. При чтении или записи файловая переменная перемещается по очередному компоненту и делает его доступным для обработки. В Прологе пользовательские файлы описываются в разделе описания доменов следующим образом:

file = <символическое имя файла1>;...;

<символическое имя файлаN>

Символические имена файлов называют внутренними или логическими именами в отличие от внешних или физических имен файлов. Символическое имя файла должно начинаться со строчной буквы. Кроме пользовательских файлов имеются стандартные файлы, которые не нужно описывать в разделе описания доменов.

Это:

  • stdin(стандартное устройство ввода);

  • stdout(стандартное устройство вывода);

  • stderror(стандартное устройство вывода сообщений об ошибках);

  • keyboard(клавиатура);

  • screen(монитор);

  • printer(параллельный порт принтера);

  • coml(последовательный порт).

По умолчанию стандартным устройством ввода является клавиатура, а вывода – монитор. Чтобы начать работу с пользовательским файлом, его нужно открыть, а по завершении работы закрыть. Стандартное устройство открывать и закрывать не нужно. Встроенные предикаты для работы с файлами:

openread – открывает только для чтения. openwrite – только для записи. openappend – запись в конец файла openmodify – чтение и запись одновременно existfile – истинен если файл с указанным именем существует

“C:\\Prolog\\BIN”

closefile – закрытие файла renamefile – переименовать файл deletefile – удалить файл disk – задает текущий диск или каталог dir – выбор из списка файлов eof – истинен если достигнут конец файла filepos – текущая позиция чтения или записи в файле или изменить её. Первый аргумент символическое имя, второй – позиция внутри файла, третий - номер режима, который задает откуда отсчитывается позиция (0 – начало, 1 – текущая, 3 - конец) readdevice – используется для переопределения текущего устройства ввода или чтобы узнать, какое устройство является текущим. writedevice – используется для переопределения текущего устройства вывода или для получения имени текущего устройства вывода. write – предикат для записи данных в текущее устройство readln – чтение строки и з текущего устройства readint – читает целое число

readreal - читает вещественное число

readchar – читает символ

readterm – читает терм file_str – читает символы файла в строку или, наоборот, записывает содержимое строки в файл, в зависимости от того, свободен ли второй параметр этого предиката flush – используется для принудительной записи в файл содержимого внутреннего буфера, выделенного для файла, указанного в его единственном параметре filemode – задает режим доступа к файлу(0 – бинарный режим, 1 - текстовый)

Пример. Предикат, выводящий содержимое произвольного файла на экран. Параметр – внешнее дисковое имя файла.

DOMAINS /* раздел описания доменов */

file = f /* f — внутреннее имя файла */

PREDICATES /* раздел описания предикатов */

write_file(file)

writeFile(string)

CLAUSES /* раздел описания предложений */

write_file(f):–

not(eof(f)),!, /* если файл f еще

не закончился */

readchar(C), /* читаем из него символ */

write(C," "), /* выводим символ на экран*/

write_file(f). /* продолжаем процесс */

write_file(_). /* это предложение нужно, чтобы предикат

не потерпел неудачу в случае, когда

будет достигнут конец файла */

writeFile(F_N):–

existfile(F_N),!, /* убеждаемся в существовании

файла с именем F_N */

openread(f,F_N), /* связываем внешний файл F_N

с внутренним файлом f

и открываем его на чтение */

readdevice(f), /* устанавливаем в качестве

устройства чтения файл f */

write_file(f), /* вызываем предикат, выводящий

на экран все символы

файла f */

closefile(f), /* закрываем файл */

readdevice(keyboard), /* перенаправляем ввод

на клавиатуру */

nl,nl, /* пропускаем строку */

write("Нажмите любую клавишу"),

/* выводим сообщение на экран */

readchar(_)./* ждем нажатия любой клавиши */

writeFile(F_N):–

write("Файл с именем ",F_N," не наден!").

/* выдаем сообщение, если предикат

existfile потерпел неудачу */

GOAL /* раздел описания внутренней цели*/

write("Введите имя файла: "),

readln(F_N), /* читаем название файла в переменную F_N */

writeFile(F_N).

Пример. Формирование файла из символов с клавиатуры.

DOMAINS

file=f

PREDICATES

Readfile

CLAUSES

readfile:–

writedevice(screen), /* назначаем текущим

устройством записи

экран */

write("Введите символ (# — конец ввода)"), nl,

/* выводим сообщение */

readchar(C), /* читаем символ с клавиатуры */

write(C), /* дублируем символ на экран */

C<>'#',!, /* если это не #*/

writedevice(f), /* , то перенаправляем вывод

в файл */

write(C), /* записываем символ в файл */

readfile.

readfile:–

closefile(f). /* если введенный символ оказался

равен символу '#', то закрываем файл */

GOAL

write("Введите имя файла: "),

readln(F_N),

/* читаем название файла в переменную F_N */

openwrite(f,F_N), /* связываем внешний файл F_N

с внутренним файлом f и открываем

его на запись */

readfile(f).

Пример. Предикат, который переписывает один файл в другой так, чтобы в другом файле все английские буквы были большими.

transform:–

not(eof(f)),!, /* если файл f еще

не закончился */

readln(S), /* читаем из файла f строку

в переменную S */

upper_lower(S_U,S),

/* S_U — результат преобразования

всех символов строки S в верхний

егистр */

write(S_U),nl, /* записываем строку S_U

в файл f_o */

transform. /* продолжаем процесс */

transform:–

closefile(f), /* закрываем файл f */

closefile(f_o). /* закрываем файл f_o */

upper_file(N_F,N_o_F):–

existfile(N_F),!, /* проверяем существование

файла с именем N_F */

openread(f,N_F), /* связываем внешний файл

с именем N_F с внутренним

файлом f и открываем его

на чтение */

readdevice(f), /* устанавливаем в качестве

текущего устройства чтения

файл f */

openwrite(f_o,N_o_F),

/* связываем внешний файл с именем

N_o_F с внутренним файлом f

и открываем его на запись */

writedevice(f_o), /* устанавливаем в качестве

текущего устройства записи

файл f_o */

transform. /* вызываем вспомогательный

предикат */

upper_file(N_F,_):–

write("Файл с именем ",N_F," не найден!").

/* выдаем сообщение, если предикат

existfile был неуспешен */