2011-01-26 147 views

回答

13

在SWI-Prolog中,最简洁的解决方案是编写一个描述“行”的DCG,然后调用每行的谓词。使用库(pio)将DCG应用于文件。

编辑:按照要求,考虑:

:- use_module(library(pio)). 

lines([])   --> call(eos), !. 
lines([Line|Lines]) --> line(Line), lines(Lines). 

eos([], []). 

line([])  --> ("\n" ; call(eos)), !. 
line([L|Ls]) --> [L], line(Ls). 

使用范例:?- phrase_from_file(lines(Ls), 'your_file.txt').

+0

我知道这已经很长时间了,但我正在尝试这种方法,它似乎花了很长时间。您能否提供一些使用DCG和库(pio)的高性能代码的示例,这些代码将通过行读取文件?谢谢! – 2014-10-22 03:21:34

14

您可以使用read读取流。请记住调用at_end_of_stream以确保没有语法错误。

实施例:

readFile.pl

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). 

MYFILE.TXT

'line 0'. 
'line 1'. 
'line 2'. 
'line 3'. 
'line 4'. 
'line 5'. 
'line 6'. 
'line 7'. 
'line 8'. 
'line 9'. 

因此通过调用main您将收到的输出:

?- main. 
[line 0,line 1,line 2,line 3,line 4,line 5,line 6,line 7,line 8,line 9] 
true 

只需配置main。当然,这里的输出是一个使用write的例子。配置以匹配您的请求。

我假设这个原理可以用来回答你的问题。祝你好运。