Переписать содержимое файла в строку(или список). На SWI-Prolog

readFile(Path):- 
    open(Path, read, Stream),
    get_char(Stream, Char1),
    process_the_stream(Char1, Stream),
    close(Stream).

process_the_stream(end_of_file, _):-!.
process_the_stream(Char, Stream):-
    write(Char),
    get_char(Stream, Char2),
    process_the_stream(Char2, Stream).

Данный код выводит содержимое файла.

Нужно, чтобы запрос выглядел следующим образом:

?-readFile("D:/file.txt", Res).
Res = "Содержимое файла".

или

Res = ['С','о','д','е','р','ж','и','м','о','е',' ','ф','а','й','л','а'].

Ответы (1 шт):

Автор решения: Rylexium

Текст программы, которая содержимое файла преобразовывает в список атомов(символов).

file_to_list(Path,Lst):-
    open(Path, read, Stream),%открыли файл на чтение
    get_char(Stream,Char),%получаем первый символ из потока
    stream_to_list(Stream, Lst, Char), %передаем наш поток, лист где хранится результат, и первый символ
    close(Stream).%закрываем поток

stream_to_list(_Stream,[],end_of_file):-!. %если конец файла, то делать ничего не надо

stream_to_list(Stream,[Char|Tail],Char):- 
    get_char(Stream,Char1),%получаем следующий символ
    stream_to_list(Stream,Tail,Char1). %рекурсивно пробегаем по всему файлу

Формируем запрос: ?-file_to_list("D:/some_file.txt", L).

Результат будет таким: L = [' ', ' ', f, d, ' ', ' ', g, f, s|...].

!!! Не обращайте внимание, что в конце стоит "..." (многоточие), на самом деле в листе находится все атомы, которые есть в файле. !!! При желании, можно полученный список атомов(символов) преобразовать в строку.

→ Ссылка