用prolog阅读行列表

时间:2014-11-09 08:34:30

标签: list file io prolog

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

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'而不是项目列表。 我不确定我在这里做错了什么,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分: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术语,因此您可以使用many nice options附带的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)
  ).

希望这会帮助你!