io - swi - Lea un archivo línea por línea en Prolog
prolog pdf (2)
Me gustaría leer un archivo de texto sin formato y aplicar un predicado a cada línea (los predicados contienen write
que hace la salida). ¿Como podría hacerlo?
Puede usar read
para leer la secuencia. Recuerde invocar at_end_of_stream
para garantizar que no haya errores de sintaxis.
Ejemplo:
readFile.pl
main :-
open(''myFile.txt'', read, Str),
read_file(Str,Lines),
close(Str),
write(Lines), nl.
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
/+ at_end_of_stream(Stream),
read(Stream,X),
read_file(Stream,L).
myFile.txt
''line 0''.
''line 1''.
''line 2''.
''line 3''.
''line 4''.
''line 5''.
''line 6''.
''line 7''.
''line 8''.
''line 9''.
Por lo tanto, al invocar main
recibirás el resultado:
?- main.
[line 0,line 1,line 2,line 3,line 4,line 5,line 6,line 7,line 8,line 9]
true
Solo configura main
. La salida aquí es un ejemplo usando write
, por supuesto. Configure para que coincida con su solicitud.
Supongo que este principio se puede aplicar para responder a su pregunta. Buena suerte.
En SWI-Prolog, la solución más limpia es escribir un DCG que describa qué es una "línea" y luego llamar a un predicado para cada línea. Use la biblioteca (pio) para aplicar el DCG a un archivo.
EDITAR : según lo solicitado, considere:
:- use_module(library(pio)).
lines([]) --> call(eos), !.
lines([Line|Lines]) --> line(Line), lines(Lines).
eos([], []).
line([]) --> ( "/n" ; call(eos) ), !.
line([L|Ls]) --> [L], line(Ls).
Uso de muestra ?- phrase_from_file(lines(Ls), ''your_file.txt'').