【问题标题】:Prolog - unexpected end of fileProlog - 文件意外结束
【发布时间】:2014-06-18 03:13:37
【问题描述】:

在 Prolog 中读取文件出错

嗨,我正在做一个 Prolog 项目,我需要阅读其中的整个文件。我有一个名为“meno.txt”的文件,我需要阅读它。我在堆栈上找到了一些代码。代码如下:

main :-
  open('meno.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).

当我调用 main/0 谓词时,我收到一条错误消息,提示文件意外结束。我的文件如下所示:

line1
line2
line3
line4

我在这里也发现了类似的问题以及 ASCII 和 UTF 编码的解决方案,但我试过了,它似乎不是我的解决方案。有人可以帮忙吗?

【问题讨论】:

  • 如果每一行都是谓词,例如subtype("apple","fruit"),并且输入文件最初是由Prolog I/O写入的,我的问题是,你如何写入带有句点的文件一开始就结束了?

标签: input io prolog


【解决方案1】:

如果您使用的是 SWI Prolog,则可以使用类似这样的方式进行读取:

read_file(Stream,[X|L]) :-
    \+ at_end_of_stream(Stream),
    read_line_to_codes(Stream,Codes),
    atom_chars(X, Codes),
    read_file(Stream,L), !.

read_line_to_codes/2 将每一行直接读入字符代码数组。然后atom_chars/2 会将代码转换为原子。

【讨论】:

    【解决方案2】:

    谓词read/2 从文件中读取Prolog 术语。这些必须以句点结尾。尝试将文件内容更新为:

    line1.
    line2.
    line3.
    line4.
    

    Prolog 解析器尝试查找结束句点可能导致文件意外结束。

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多