[英]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.