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