在prolog中逐行读取文件

时间:2014-12-19 21:33:58

标签: prolog readfile swi-prolog

使用以下代码阅读文件,但此代码仅读取有'。'的行。在文件的末尾,还有另一种方法来读取任何类型的文件并存储在列表中吗?

main :-
   open('myFile.txt', read, Str),
   read_file(Str,Lines),
   close(Str),
   write(Lines), nl.

read_file(Stream,[]) :-
    at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
    \+ at_end_of_stream(Stream),
    read(Stream,X),
    read_file(Stream,L).

我从这个链接中获取了这段代码 Read a file line by line in Prolog

1 个答案:

答案 0 :(得分:2)

请注意,由于以下原因,您编写的代码本质上是不正确的。

1mo,您正在阅读Prolog数据,而不是行。取a. b. c.列表[a,b,c]

2do,对at_end_of_stream/1的测试非常棘手,并且在阅读Prolog数据时无法按预期工作。拿3行文件:

first_fact.
second_fact.
% no comment - oh that's a comment nevertheless

这将为您提供列表[first_fact, second_fact, end_of_file]。在阅读完最后一行后,read/1会为您提供一个字词end_of_file

3tio,在回溯时,main将始终产生错误!

?- main.
[first_fact,second_fact,end_of_file]
true ;
ERROR: at_end_of_stream/1: stream `<stream>(0x1c38330)' does not exist

如果您只想读取字节,请使用library(pio)。要使用它,首先要学习形式主义。 对于文件中每次出现magic,以下内容将成功:

?- phrase_from_file((..., "magic", ...), filename).

使用... //0的以下定义:

... --> [] | [_], ... .

请参阅this for more