Пятница, 03.05.2024, 13:47
Приветствую Вас Гость | RSS

Язык программирования ПРОЛОГ

Чтение, запись в файлы

Чтение из файла

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),

exit.
Меню сайта
Форма входа
Поиск
Календарь
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Long Time Ago © 2024
Сделать бесплатный сайт с uCoz