2015-01-04 2 views
1

Я получаю эту ошибку: ОШИБКА: demograph.grf: 9: 16: ошибка синтаксиса: Неожиданный конец файлаПролог ОШИБКА: demograph.grf: 9: 16: Ошибка синтаксиса: Неожиданный конец файла

file_to_list(FILE,LIST) :- 
    see(FILE), 
    inquire([],R), % gather terms from file 
    reverse(R,LIST), 
    seen. 

inquire(IN,OUT):- 
    read(Data), 
    (Data == end_of_file -> % done 
     OUT = IN 
     ; % more 
     inquire([Data|IN],OUT)) . 

файл_ввода http://www.ist.tugraz.at/_attach/Publish/LP/demograph.grf

+1

См. [Читать/1] (http://www.swi-prolog.org/pldoc/man?predicate=read/1). Prolog 'read/1' ожидает, чтобы прочитать * Prolog term * из файла. Файл '.grf', который вы читаете, не имеет полного термина Prolog, поэтому он доходит до конца файла перед его чтением. – lurker

+0

Поскольку ваш входной файл не содержит терминов Prolog, вы должны использовать ['get/2'] (http://www.swi-prolog.org/pldoc/man?section=chario) для чтения char по char. –

+0

'see',' seen', 'get' - все это полностью устаревшие встроенные модули в Prolog - и это более 20 лет. Используйте 'open/3',' close/1' и (если вам нужно) 'get_code' вместо этого. – false

ответ

1
:- use_module(library(readutil)). 
read_header_data(Stream, Header) :- 
     open(Stream, read, In), 
     read_lines(In, Char), 
     read_line_to_codes(In, Header, Tail), 
%  read_header_data(Header, Fd, Tail). 
     close(In). 

    read_lines(Stream, []) :- 
    at_end_of_stream(Stream). 

read_lines(Stream, [H|T]) :- 
    \+ at_end_of_stream(Stream). 
    read(Stream, X), 
    read_lines(Stream, T). 

Не совсем то, что я хочу. Результат должен выглядеть так:

Lss = 
[[0, 1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 1, 0, 0, 1, 1, 0],[0, 0, 0, 0, 0, 1, 0, 0, 0],[0, 1, 0, 0, 1, 0, 0, 1, 0],[0, 0, 0, 1, 0, 1, 0, 1, 1], [0, 0, 1, 0, 1, 0, 0, 0, 1],[0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 0, 1, 0, 1],[0, 0, 0, 0, 1, 1, 0, 1, 0]] . 
1

Теперь я получаю это по строкам.

, но вместо 0 он пишет 48 и для одного 49 и для пробела 32. Как это 0,1 и пробел.

process(File) :- 
open(File, read, In), 
read_line_to_codes(In, Char1), 
process_stream(Char1, In), 
close(In). 

process_stream(end_of_file, _) :- !. 
process_stream('\n', _) :- !. 
process_stream(Char, In) :- 
process_print(Char, In), 
%get_char(In, Char2), 
read_line_to_codes(In, Char2), 
process_stream(Char2, In). 
process_print(Char, _) :- 
print(Char),print(' nextChar'),nl.