1

テキストファイルがあり、それを読み込んで画面に印刷し、新しい出力ファイルに書き込みたいと思います。だから私がこれまでにやったことは

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

私は何をすべきか?

4

3 に答える 3

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です。

次の定義をロードする必要があります。

... --> [] | [_], ... .
于 2011-11-12T22:51:43.377 に答える
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
    ).

これは、SWI-Prologビルトインであるread_line_to_codesを呼び出します。

于 2011-11-14T16:28:34.297 に答える
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').

于 2011-11-12T22:55:20.713 に答える