GeorgeF0
GeorgeF0

Reputation: 431

String Stream in Prolog?

I have to work with some SWI-Prolog code that opens a new stream (which creates a file on the file system) and pours some data in. The generated file is read somewhere else later on in the code.

I would like to replace the file stream with a string stream in Prolog so that no files are created and then read everything that was put in the stream as one big string.

Does SWI-Prolog have string streams? If so, how could I use them to accomplish this task? I would really appreciate it if you could provide a small snippet. Thank you!

Upvotes: 4

Views: 1728

Answers (2)

code_x386
code_x386

Reputation: 798

Another option is using with_output_to/2 combined with current_output/1:

write_your_output_to_stream(Stream) :-
    format(Stream, 'example output\n', []),
    format(Stream, 'another line', []).

str_out(Codes) :-
    with_output_to(codes(Codes), (
        current_output(Stream),
        write_your_output_to_stream(Stream)
    )).

Usage example:

?- portray_text(true), str_out(C).
C = "example output
another line"

Of course, you can choose between redirecting output to atom, string, list of codes (as per example above), etc., just use the corresponding parameter to with_output_to/2:

with_output_to(atom(Atom), ... )
with_output_to(string(String), ... )
with_output_to(codes(Codes), ... )
with_output_to(chars(Chars), ... )

See with_output_to/2 documentation:

http://www.swi-prolog.org/pldoc/man?predicate=with_output_to/2

Later on, you could use open_string/2, open_codes_stream/2 and similar predicates to open string/list of codes as an input stream to read data.

Upvotes: 3

CapelliC
CapelliC

Reputation: 60024

SWI-Prolog implements memory mapped files. Here is a snippet from some old code of mine, doing both write/read

%%  html2text(+Html, -Text) is det.
%
%   convert from html to text
%
html2text(Html, Text) :-
    html_clean(Html, HtmlDescription),
    new_memory_file(Handle),
    open_memory_file(Handle, write, S),
    format(S, '<html><head><title>html2text</title></head><body>~s</body></html>', [HtmlDescription]),
    close(S),
    open_memory_file(Handle, read, R, [free_on_close(true)]),
    load_html_file(stream(R), [Xml]),
    close(R),
    xpath(Xml, body(normalize_space), Text).

Upvotes: 7

Related Questions