2014-11-09 72 views
0

我有一个带有一些信息的文本文件,每行都是一个值列表。我想阅读每行,并将其与所有其他行一起存储在列表中。 这是我的代码到目前为止将行读入列表序言

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”,而不是项目的列表。 我不知道我在做什么错在这里,任何帮助将不胜感激。

回答

0

您的代码无法按您想要的方式在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
  • 由于您正在阅读的数据恰好是序言条款,因此您可以使用read_term/3,它附带many nice options
  • 请注意,在列表构建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) 
). 

希望这可以帮助你!

+0

谢谢,我只是在学习Prolog,它有时会变得非常混乱。您提供的信息非常有帮助,但我已经可以在项目中看到一些可以改进的地方。 – Ashani 2014-11-09 12:21:52