我写了一个实用程序,用来获取一行代码。在末尾返回end_of_file。。。
我觉得我用一些我认为应该很容易的东西把头撞在墙上。也许我的做法不正确。我绝对不理解Prolog中I/O背后的概念。(例如:流别名和open/3绑定的变量之间有什么区别?)但我跑题了:
如何在GNU Prolog中逐行读取文件?(因此,在无法访问SWI所拥有的方便功能的情况下。)我认为这与get_char/1和peek_char/1(检查终止换行符)有关,但到目前为止,我实现可行解决方案的尝试都失败了。
以下是我所了解到的:
readl_as_list(ID, X):-
current_input(ID),
readl_as_list(X).
readl_as_list([X]):-
(peek_char(NextChar), ==(NextChar, 'n');
get_code(Char1),
append([X], [Char1], X),
readl_as_list(X)).
printl_list([]):-
!, nl.
printl_list([H|X]):-
put_code(H), printl_list(X).
将其加载到解释器中,我得到(为了可读性,删除了空行):
| ?- open('word_list.txt', read, ID).
ID = '$stream'(2)
yes
| ?- readl_as_list(ID, X).
ID = '$stream'(0)
X = [_] ?
% (interpreter pauses until I press return)
yes
| ?- printl_list(X).
X = []
yes
行不一定要作为字符列表读取,但由于我的目标是在单词列表中搜索符合某些条件的单词(例如,没有重复字母),这似乎是最明智的方法
read_line_codes(S, SoFar, L) :-
get_code(S, C),
( C == -1
-> ( SoFar == []
-> L = end_of_file
; reverse(SoFar, L)
)
; ( C == 0'n
-> reverse(SoFar, L)
; read_line_codes(S, [C|SoFar], L)
)
).
测试:
?- open('data_grid.pl',read,S),repeat,read_line_codes(S,[],L),format('~s',[L]).
/* File: data_grid.pl
S = <stream>(0x335c9e0),
L = [47, 42, 32, 32, 70, 105, 108, 101, 58|...] ;
Author: Carlo,,,
S = <stream>(0x335c9e0),
L = [32, 32, 32, 32, 65, 117, 116, 104, 111|...] ;
Created: Oct 20 2011
S = <stream>(0x335c9e0),
L = [32, 32, 32, 32, 67, 114, 101, 97, 116|...] ;
...