读线与序言名单(reading lines into lists with prolog)

2019-10-21 06:03发布

我有一些信息的文本文件,每一行是值的列表。 我想读的每一行并将其存储在与所有其他线路的列表。 这是我到目前为止的代码

getLines:-
      open('textFile.abc', read, Source),
      readData(Source,DataList),
      write(DataList).

readData(Source,DataList):-
                    read(Source,NewLine),
                    NewLine== end_of_file -> fail;true,
                    readData(Source,[DataList|NewLine]).

readData(Source,[DataList|end_of_file]).

这是文本文件“textfile.abc”

[0.45,20,850,900,3].
[0.45,20,850,900,2].
[0.45,20,850,900,1].

当我运行getLines它执行,并写入“_G1147068”,而不是项目的列表。 我不知道我在做什么错在这里,任何帮助,将不胜感激。

Answer 1:

为什么你的代码不工作,你想让它的方式,主要原因是第二子句中发现readData/2 (下面引用)。 它包含两个单变量和[DataList|end_of_file]是不是列表(因为end_of_file是原子)。

readData(Source,[DataList|end_of_file]).

您的代码可以在其他方面也得到改善:

  • 您打开一个流,但你永远不会关闭它:你可以用close/1本。
  • 即使你关闭流之后readData/2成功,假设你的程序抛出一个异常或在运行失败readData/2 。 现在close/1不会达到和流将仍然是开放的。 幸运的是, setup_call_cleanup/3用于关闭即使你的代码没有流/抛出异常。
  • 既然你正在阅读的数据恰好是Prolog的条款,你可以使用read_term/3附带了许多不错的选择 。
  • 请注意,在列表构造L = [H|T]我确保T总是一个列表。

生成的代码:

getLines(L):-
  setup_call_cleanup(
    open('textFile.abc', read, In),
    readData(In, L),
    close(In)
  ).

readData(In, L):-
  read_term(In, H, []),
  (   H == end_of_file
  ->  L = []
  ;   L = [H|T],
      readData(In,T)
  ).

希望这可以帮助你!



文章来源: reading lines into lists with prolog