如何迭代使用read_line_to_codes和atom_codes生成行数组作为.txt文件的字符串?

时间:2019-03-26 20:15:21

标签: prolog gnu-prolog

我正在尝试使用read_line_to_codes(Stream,Result)atom_codes(String,Result)。这两个谓词首先从文件中读取一行作为字符代码数组,然后将该数组转换回字符串。然后,我想将所有这些字符串输入到字符串数组中。

我尝试了递归方法,但是在如何将数组实际实例化为空开始时遇到麻烦,process_the_stream/2的终止条件也很麻烦。

/*The code which doesn't work.. but the idea is obvious.*/

process_the_stream(Stream,end_of_file):-!.
process_the_stream(Stream,ResultArray):-
        read_line_to_codes(Stream,CodeLine),
        atom_codes(LineAsString,CodeLine),
        append_to_end_of_list(LineAsString,ResultArray,TempList),
        process_the_stream(Stream,TempList).

我希望使用递归方法将行数组作为字符串。

2 个答案:

答案 0 :(得分:2)

遵循基于Logtalk的便携式解决方案,您可以将其直接用于大多数Prolog编译器(包括GNU Prolog),或适应您自己的代码:

---- processor.lgt ----
:- object(processor).

    :- public(read_file_to_lines/2).

    :- uses(reader, [line_to_codes/2]).

    read_file_to_lines(File, Lines) :-
        open(File, read, Stream),
        line_to_codes(Stream, Codes),
        read_file_to_lines(Codes, Stream, Lines).

    read_file_to_lines(end_of_file, Stream, []) :-
        !,
        close(Stream).
    read_file_to_lines(Codes, Stream, [Line| Lines]) :-
        atom_codes(Line, Codes),
        line_to_codes(Stream, NextCodes),
        read_file_to_lines(NextCodes, Stream, Lines).

:- end_object.
-----------------------

用于测试的示例文件:

------ file.txt -------
abc def ghi
jlk mno pqr
-----------------------

简单测试:

$ gplgt
...

| ?- {library(reader_loader), processor}.
...

| ?- processor::read_file_to_lines('file.txt', Lines).

Lines = ['abc def ghi','jlk mno pqr']

yes

答案 1 :(得分:0)

在这个问题上,我感到很困惑。

  • 该问题被标记为“ gnu-prolog”,但是read_line_to_codes/2不在其标准库中。
  • 您在谈论字符串:您的意思是什么?您能否显示the type testing predicates in GNU-Prologin SWI-Prolog中的哪一个应该在这些“字符串”上成功?
  • 期望是一种递归方法。这意味着什么?您想要递归方法,必须使用递归方法,还是您认为如果这样做,最终将得到递归方法?

要在SWI-Prolog中做到这一点而无需递归,并获取 strings

read_string(Stream, _, Str), split_string(Str, "\n", "\n", Lines)

如果您需要其他东西,则需要更好地说明它是什么。