我有一个文本文件,我想将其读入并在屏幕上打印出来并将它们写入新的输出文件中。所以我到目前为止所做的是
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
我该怎么办?
答案 0 :(得分:2)
read/2
读取有效的Prolog文本。该消息表明,在text.txt的第1行中,您有一些无效的Prolog文本。也许用空格分隔几个单词。
如果您想阅读常规文本,可以使用get_char/2
执行非常低级别的操作,或者您可能希望使用语法更高级别地执行此操作。 SWI-Prolog有library(pio)
。
这是Prolog程序员相当于grep -q
。
?- phrase_from_file((...,"root",...),'/etc/passwd').
true ;
true ;
true ;
false.
实际上,那是grep -c
。
您需要加载以下定义:
... --> [] | [_], ... .
答案 1 :(得分:1)
如果您需要可重复使用的代码段:
%% 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_codes,一个内置的SWI-Prolog。
答案 2 :(得分:0)
is_eof(FlHndl, CharCode, CurrentLine, FileAkku, FileContent) :-
CharCode == -1,
append(FileAkku, [CurrentLine], FileContent),
close(FlHndl), !.
is_newline(FlHndl, CharCode, CurrentLine, FileAkku, FileContent) :-
CharCode == 10,
append(FileAkku, [CurrentLine], NextFileAkku),
read_loop(FlHndl, '', NextFileAkku, FileContent).
append_char(FlHndl, CharCode, CurrentLine, FileAkku, FileContent) :-
char_code(Char, CharCode),
atom_concat(CurrentLine, Char, NextCurrentLine),
read_loop(FlHndl, NextCurrentLine, FileAkku, FileContent).
read_file(FileName, FileContent) :-
open(FileName, read, FlHndl),
read_loop(FlHndl, '', [], FileContent), !.
read_loop(FlHndl, CurrentLine, FileAkku, FileContent) :-
get_code(FlHndl, CharCode),
( is_eof(FlHndl, CharCode, CurrentLine, FileAkku, FileContent)
; is_newline(FlHndl, CharCode, CurrentLine, FileAkku, FileContent)
; append_char(FlHndl, CharCode, CurrentLine, FileAkku, FileContent)).
main(InputFile, OutputFile) :-
open(OutputFile, write, OS),
( read_file(InputFile,InputLines),
member(Line, InputLines),
write(Line), nl,
write(OS,Line),nl(OS),
false
;
close(OS)
).
因此,您可以像main('text.txt', 'output.txt').