Io 如何读入文本文件并将其打印到Prolog中的文件中?
我有一个文本文件,我想把它读入并在屏幕上打印出来,然后把它们写入一个新的输出文件。所以到目前为止我所做的是Io 如何读入文本文件并将其打印到Prolog中的文件中?,io,prolog,dcg,Io,Prolog,Dcg,我有一个文本文件,我想把它读入并在屏幕上打印出来,然后把它们写入一个新的输出文件。所以到目前为止我所做的是 main :- open('text.txt', read, ID), % open a stream repeat, % try again forever read(ID, X), % read from the stream write(X), nl, % write to current outpu
main :-
open('text.txt', read, ID), % open a stream
repeat, % try again forever
read(ID, X), % read from the stream
write(X), nl, % write to current output stream
X == end_of_file, % fail (backtrack) if not end of
!,
close(ID).
但我只收到一条错误信息,比如
ERROR: text.txt:1:0: Syntax error: Operator expected
我该怎么办?读取/2读取有效的序言文本。该消息表明,text.txt的第1行中有一些无效的序言文本。也许是几个用空格隔开的单词 如果您想阅读常规文本,可以使用
get_char/2
在非常低的级别上阅读,或者您可能希望使用语法在更高的级别上阅读。SWI Prolog为此提供了库(pio)
下面是Prolog程序员的等价物grep-q
?- phrase_from_file((...,"root",...),'/etc/passwd').
true ;
true ;
true ;
false.
实际上,这相当于grep-c
您需要为其加载以下定义:
... --> [] | [_], ... .
因此,您可以像
main('text.txt',output.txt')一样使用它。
如果您想要一个可重用的代码段:
%% file_atoms(File, Atom) is nondet.
%
% read each line as atom on backtrack
%
file_atoms(File, Atom) :-
open(File, read, Stream),
repeat,
read_line_to_codes(Stream, Codes),
( Codes \= end_of_file
-> atom_codes(Atom, Codes)
; close(Stream), !, fail
).
这将调用read_line_to_代码,即SWI Prolog内置代码
%% file_atoms(File, Atom) is nondet.
%
% read each line as atom on backtrack
%
file_atoms(File, Atom) :-
open(File, read, Stream),
repeat,
read_line_to_codes(Stream, Codes),
( Codes \= end_of_file
-> atom_codes(Atom, Codes)
; close(Stream), !, fail
).