Чтение из файла
1. Открытие файла предикатом openread.
2. Назначение файла устройству чтения с помощью readdevice.
3. Само чтение из файла.
4. Использование произвольных предикатов и правил.
5. Закрытие файла предикатом close.
/* Считывание данных из файла и вывод их на экран и принтер */
domains
file = datafile
predicates
read_and_print
read_file
goal
read_file
clauses
read_file:- write ("Введите имя
файла”), nl,
readln(FileName), nl,
openread (datafile, FileName), readdevice
(datafile),
read_and_print, closefile (datafile),nl,
write ("Нажмите любую клавишу”),
readdevice (keyboard),
readchar (_), exit.
read_and_print:- not (eof(datafile)),
readln (Fstr), write (Fstr), nl,
writedevice (printer), write (Fstr),
writedevice (screen), read_and_print.
read_and_print:- eof(datafile),!.
Дозапись в конец существующего файла
process_append:-
write ("Введите имя файла”), nl,
readln (Filename), nl, write ("Программа готова принять данное для записи”), nl,
openappend
(datafile, Filename), writedevice (datafile), readln (Kstr),
concat (Ksrt,
"\13\10”, Fstr), readin (Kstr, Fstr), closefile (datafile).
% readin – смотри выше.
Использование файлов прямого доступа
В файлах прямого доступа все записи имеют одинаковую длину. Когда указатель файла перемещается по позициям, номера которых кратны длине записи, он всегда указывает на начало очередной записи. Для работы с файлами прямого доступа обычно используются встроенные предикаты openmodify и filepos.
/* Создание файла прямого доступа */
create_a_random_process_file:-
write ("Введите имя файла”), nl, readln (Filename),
openwrite (datafile, Filename), closefile (datafile),
openmodify (datafile, Filename),
write ("Введите строку данных. Окончание ввода - stop”), nl,
readln (KStr), write_read_more (0, KStr), closefile (datafile).
Предикаты openwrite и closefile создают файл, который первоначально пустой. Openmodify открывает файл для его модификации (записи данных). Readln читает первую строку данных с клавиатуры, а предикат write_read_more записывает считанные строки в файл и читает новые. Рекурсивное правило write_read_more дополняет строку до 38 символов, сцепляет ее с комбинацией спецсимвола, определяющего конец строки и записывает полученную строку в файл.
write_read_more (_,
"Stop”):- nl, write ("Нажмите любую клавишу”),
readchar (_), exit.
write_read_more
(Index, KStr):-
writedevice (datafile), filepos (datafile, Index, 0),
pod_string (KStr, PodStr, 38), concat (PodStr, "\10\13”, FStr),
write (FStr), writedevice (screen), write ("Введите строку”), nl,
readln (KStr1), Index1=Index+1, write_read_more (Index1, KStr).
Filepos увеличивается на 40 перед очередным кругом рекурсии, благодаря чему каждый раз перед занесением новой записи помещается в нужное место. Рекурсивное правило испоьзует правило pod_string для дополнения строки "-”. Это правило выглядит так:
pod_string (Instr,
Instr, Len):- str_len (Instr, L), L>=Len,!.
pod_string (Instr,
Podstr, Len):- concat (Instr, "-”, Newstr),
pod_string (Newstr, Podstr, Len).
Окончание рекурсии в pod_string связано с выравниванием значения длины текущей строки и переменной Len (Len =38).
/* Чтение из файла прямого доступа */
read_a_random_access_file:-
write ("Введите имя файла”),
nl, readln (Filename), openread (datafile, Filename),
write ("Введите номер файла”), nl, ]
readreal (Record), Index=(Record –1)*40,
readdevice (datafile), filepos (datafile, Index, 0),
readln (FStr), write (FStr), nl, nl,
write ("Нажмите любую клавишу”), nl,
readdevice (keyboard), readchar (_), closefile (datafile),