我正在使用
将列表列表写入文件choice(2, X):-
nl, write('\tRead roster from a file:'),nl, write('\tEnter file name: '),read(N),
open(N,write,Stream), write(Stream, X), nl(Stream),close(Stream), write('\tRoster stored.'),nl,nl,menu(X).
然后我用
读它choice(1, X):-
nl, write('\tStore roster to a file:'),nl, write('\tEnter file name: '),read(N),
open(N,read,Stream), read(Stream, Y), close(Stream), write('\tRoster stored.'),nl,nl,menu(Y).
这是我选择(1,X)时选择的样本(2,X)的内容。
[[[49,48,48],[100,97,109,105,101,110],100]]
当我尝试阅读时会出现错误
ERROR: r2:1:44: Syntax error: Unexpected end of file
答案 0 :(得分:3)
您收到此错误,因为read/2
只能读取以.
终止的完整序言。您的文件内容不会以点结尾,因此文件结尾为"意外"。
我的建议是你应该修改它:
open(N,read,Stream), read(Stream, Y), close(Stream)
进入那个:
open(N,read,Stream), read_line_to_codes(Stream, Codes), close(Stream), atom_codes(Atom, Codes), atom_to_term(Atom, Y, [])
上面的代码读取一行字符数据,将其转换为atom,然后将其转换为与Y统一的prolog术语。
这是我从解释器输入和输出以证明它有效:
?- open('test2.txt',read,Stream), read_line_to_codes(Stream, Codes), close(Stream), atom_codes(Atom, Codes), atom_to_term(Atom, List, []).
List = [[[49, 48, 48], [100, 97, 109, 105, 101, 110], 100]].
档案test2.txt
的内容:[[[49,48,48],[100,97,109,105,101,110],100]]
(最后没有点)
答案 1 :(得分:3)
正如@Grzegorz正确地说的那样,为了能够阅读read
的术语,它需要以句号结束。
但我不认为解决问题的正确方法是将其作为代码阅读。我认为更好的方法就是为文件写一个句号。
我认为推荐的方法是使用write_term
fullstop(true)
选项代替write
。但这不适用于我的SWI-Prolog版本。
最简单的方法就是使用write(Stream, '.')
明确写出句号。