繁体   English   中英

从 prolog 中的文本文件中读取

[英]Reading from textfile in prolog

我在读取 GNU Prolog 中的文本文件时遇到了一些麻烦。 我想读取 a.txt 文件并将文件移动到列表中。 我试图按照 stackoverflow 上的一些先前示例来读取文件,但无法访问该文件(似乎)。 这是我到目前为止所得到的:

readFile:-
    open('text.txt', read, File),
    read_lines(File, Lines),
    close(File),
    write(Lines), nl.

read_lines(File,[]):- 
    at_end_of_stream(File).

read_lines(File,[X|L]):-
    \+ at_end_of_stream(File),
    read(File,X),
    read_lines(File,L).

当我尝试调用时: ?- readFile. 给我一个错误消息: uncaught exception: error(syntax_error('text.txt:2 (char:1). or operator expected after expression'),read/2)

提前致谢!

编辑:正如大卫所提供的,GNU Prolog 的字符输入/输出库和 get_char 为我工作!

工作代码:

readFile:-
    open('text.txt', read, File),
    read_lines(File, Lines),
    close(File),
    write(Lines), nl.

read_lines(File,[]):- 
    at_end_of_stream(File).

read_lines(File,[X|L]):-
    \+ at_end_of_stream(File),
    get_char(File,X),
    read_lines(File,L).

您可以稍微改进您的编辑答案。 首先请注意read_line/2谓词名称具有误导性。 您正在将文本文件读取为字符列表,而不是单个行列表。 您还两次调用at_end_of_stream/1谓词,并在每次调用read_lines /2谓词时创建一个虚假的选择点。 此外, at_end_of_stream/1谓词虽然是一个标准谓词,但在所有 Prolog 系统中都没有可靠的实现。 您的代码的可能重写是:

read_file(File, Chars) :-
    open(File, read, Stream),
    get_char(Stream, Char),
    read_file(Stream, Char, Chars),
    close(Stream).

read_file(Stream, Char, Chars) :-
    (   Char == end_of_file ->
        Chars = []
    ;   Chars = [Char| Rest],
        get_char(Stream, Next),
        read_file(Stream, Next, Rest)
    ).

现在您的意图更清楚了,可以使用 Logtalk reader库通过一次调用来完成相同的功能:

reader::file_to_chars(File, Chars)

但是,如果学习是您的主要目标,那么编写自己的解决方案而不是依赖现有的库是一个不错的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM