2011-11-12 43 views
1

私はテキストファイルを持っていて、それを読み込んで画面に出力し、それらを新しい出力ファイルに書きたいと思います。それでは、私がこれまで行ってきたことはテキストファイルを読み込み、Prologのファイルに出力するにはどうすればよいですか?

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

read/2は有効なPrologテキストを読み取ります。このメッセージは、text.txtの1行目に無効なPrologテキストがあることを示しています。たぶん、スペースで区切られた2つの単語。

通常のテキストを読むには、get_char/2を使用して非常に低レベルにするか、文法を使用してより高いレベルにすることができます。 SWI-Prologにはlibrary(pio)があります。

ここでは、プログラマーのgrep -qに相当します。

?- phrase_from_file((...,"root",...),'/etc/passwd'). 
true ; 
true ; 
true ; 
false. 

実際には、それはむしろgrep -cです。

は、あなたはそれのために、以下の定義をロードする必要があります。

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

この:あなたは、再利用可能なスニペットをしたい場合は

... --> [] | [_], ... . 
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').

1

のようにそれを使用することができますSWI-Prolog組み込みのread_line_to_codesを呼び出します。

関連する問題