Работа с файлами на Visual/Turbo Prolog

      Комментарии к записи Работа с файлами на Visual/Turbo Prolog отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 7 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #2932

    Чтобы работать с файлами в Turbo и Visual Prolog нужно сначала объявить тип файла в разделе domains, например:
    file = students_file; teachers_file
    В данном случае нами объявлены два идентификатора:

    1. students_file – идентификатор файла, содержащего записи о студентах;
    2. teachers_file – идентификатор файла, содержащего записи о преподавателях;

    Типы файлов могут использоваться, например для задания различных имен бинарным и текстовым файлам или файлам, отличающимся логически (как в нашем случае – файл с данными студентов и файл с данными преподавателей). Это нужно, т.к. ваша программа может одновременно открывать несколько файлов, обращаться к ним вы можете через идентификаторы.

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

    1. openread(Id, Path) – открывает файл для чтения, если файл не получится открыть – вы получите ошибку:

      PROGRAM ERROR. Module:C:\WINDOWS\TEMP\GOAL$000.PRO Pos:445
      Message:7002 File not found

    2. openwrite(Id, Path) – создает и открывает файл для записи. Если файл уже открыт другим процессом по записи (следовательно заблокирован операционной системой) – вы получите ошибку. Если файл уже существует – он будет очищен;
    3. openappend(Id, Path) – создает и открывает файл для записи в конец. Функция выполняет то же самое, что openwrite, но если файл уже существует – не удаляет его, а устанавливает каретку записи на конец файла;
    4. openmodify(Id, Path) – создает и открывает файл одновременно для чтения и записи. После открытия каретки чтения и записи установлены на начало файла (при выполнении записи содержимое файла будет переписываться). Если файл не существует – он будет создан.

    Чтобы избежать ошибки при отсутствии файла в функции openread, нужно проверить наличие соответствующего файла на диске с помощью функции existfile(Path).

    Итак, мы открыли файл, но чтобы записывать или считывать с него данные нужно задать его в качестве текущего устройства ввода/вывода, сделать это можно с помощью функций writedevice(Id) и readdevice(Id). После их вызова все запросы на ввод/вывод (например вызовы функций readInt, write, nl) будут переадресованы соответствующему файлу. Если после работы с файлом нам потребуется вывести сообщения на экран или запросить ввод с клавиатуры – нужно переключить этими же функциями ввод/вывод на соответствующие устройства – stdin, stdout, stderr.

    После работы с файлом его нужно закрывать функцией closefile(Id).

    В качестве примера, напишем программу, считывающую список целых чисел с файла:

    domains
      file = text_input_file
      list_integer = integer*
    predicates
      file_numbers_to_list(file, list_integer, list_integer)
    clauses
      file_numbers_to_list(File, Buffer, Buffer):-
        eof(File), !.
      file_numbers_to_list(File, Buffer, List):-
        readint(Number), !,
        file_numbers_to_list(File, [Number|Buffer], List).
      file_numbers_to_list(_File, _Buffer, _List):-
        write("bad file"), nl, fail.
    goal 
      FileName = "/home/rrrfer/input.txt",
      openread(text_input_file, FileName), !,
      readdevice(text_input_file), 
      file_numbers_to_list(text_input_file, [], List),
      closefile(text_input_file).

    Функция file_numbers_to_list использует метод накапливающего параметра – результат накапливает во втором аргументе (буфере). Считывание продолжается до тех пор, пока в файле содержатся данные – когда будет достигнут конец файла eof(File) завершится успешно и функция вернет накопленный результат. Если файл содержит что-то кроме целых чисел, функция readint вернет fail и функция выведет сообщение об ошибке.
    Важно что функции ввода в visual prolog считывают данные с клавиатуры или текстового файла до символа перевода строки или конца файла, поэтому если вы запишите числа в файле через пробел – они завершатся неудачей. Исходный файл для этой программы должен содержать по одному числу на каждой строке. Если числа в файле содержатся в ином порядке или вам требуется обработать отдельные слова файла – можете считать строки целиком с помощью функции readln, преобразовать их в списки символов, затем – в список слов, после чего слова можно будет преобразовать в числа.

Для ответа в этой теме необходимо авторизоваться.