Stream Prolog中的字符串流?

Stream Prolog中的字符串流?,stream,stringstream,swi-prolog,Stream,Stringstream,Swi Prolog,我必须使用一些SWI Prolog代码来打开一个新的流(在文件系统上创建一个文件)并向其中注入一些数据。生成的文件稍后会在代码中的其他地方读取 我想在Prolog中将文件流替换为字符串流,这样就不会创建任何文件,然后将放入流中的所有内容作为一个大字符串读取 SWI Prolog是否有字符串流?如果是这样,我如何使用它们来完成这项任务?如果您能提供一个小片段,我将不胜感激。谢谢大家! SWI Prolog实现。下面是我的一些旧代码的一个片段,它同时执行写/读操作 %% html2text(+Ht

我必须使用一些SWI Prolog代码来打开一个新的流(在文件系统上创建一个文件)并向其中注入一些数据。生成的文件稍后会在代码中的其他地方读取

我想在Prolog中将文件流替换为字符串流,这样就不会创建任何文件,然后将放入流中的所有内容作为一个大字符串读取

SWI Prolog是否有字符串流?如果是这样,我如何使用它们来完成这项任务?如果您能提供一个小片段,我将不胜感激。谢谢大家!

SWI Prolog实现。下面是我的一些旧代码的一个片段,它同时执行写/读操作

%%  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).
%%html2text(+Html,-Text)是det。
%
%从html转换为文本
%
html2text(Html,文本):-
html_clean(html,HtmlDescription),
新的内存文件(句柄),
打开内存文件(句柄、写入、S),
格式,'html2text~S',[HtmlDescription]),
关闭(S),,
打开内存文件(句柄、读取、R、[free\u on\u close(true)],
加载html文件(流(R),[Xml]),
关闭(R),
xpath(Xml、正文(规范化_空间)、文本)。

另一个选项是将
当前\u输出/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)
    )).
用法示例:

?- portray_text(true), str_out(C).
C = "example output
another line"
当然,您可以在将输出重定向到
atom
string
、代码列表(如上例)等之间进行选择,只需使用相应的参数to
,并将u output_to/2

with_output_to(atom(Atom), ... )
with_output_to(string(String), ... )
with_output_to(codes(Codes), ... )
with_output_to(chars(Chars), ... )
请参见带有输出的
至/2
文档:


稍后,您可以使用
open_string/2
open_codes_stream/2
和类似的谓词打开字符串/代码列表作为输入流来读取数据。

随着时间的推移,答案也会随之变化。由于这是Google for上最热门的搜索结果之一,而更高的搜索结果并不能回答这个问题(您的答案是),而SWI Prolog现在已经回答了这个问题,因此您可能需要对答案进行编辑,并注意open_string/2.:)。这是我知道并且很少使用的谓词之一,但是当我需要它时,总是很难找到它。