我正在使用SWI Prolog学习Prolog,我发现在阅读和写入文件的操作方面存在一些困难。
我有这个简单的程序,它从标准输入(键盘)中读取内容并将其写在文件中:
processFile(File) :- see(File),
processFile,
seen.
processFile :- read(Query),
process(Query).
process(end_of_file) :- !.
process(Query) :- Query,
write(Query),
nl,
processFile.
我正在尝试在Linux下执行它。所以在bash中我进入Prolog源文件和 myFile 文件所在的文件夹,之后我查阅了该程序,执行以下语句:
?- processFile(myFile).
true.
正如你所看到的那样,探测器是真的,但是我无法通过键盘插入任何东西,所以任何东西都可以写入 myFile 文件。
如果我试图追踪发生的情况,我会获得以下信息:
[trace] ?- processFile(myFile).
Call: (6) processFile(myFile) ? creep
Call: (7) see(myFile) ? creep
Exit: (7) see(myFile) ? creep
Call: (7) processFile ? creep
Call: (8) read(_G697) ? creep
Exit: (8) read(end_of_file) ? creep
Call: (8) process(end_of_file) ? creep
Exit: (8) process(end_of_file) ? creep
Exit: (7) processFile ? creep
Call: (7) seen ? creep
Exit: (7) seen ? creep
Exit: (6) processFile(myFile) ? creep
true.
正如您所看到的,它可以访问 myFile 文件,并正确地询问包含读取声明的 processFile 谓词,但似乎是自动的阅读 end_of_file 原子,无法继续。
为什么呢?我该怎么做才能解决它并写入这个文件?
答案 0 :(得分:0)
你必须在文件中使用tell / 1来写,然后告诉他们恢复到之前的状态。使用see / 1,你从读取,它是空的......
但ISO IO更好......