我有一个包含一些信息的文本文件,每行都是一个值列表。我想读取每一行并将其存储在包含所有其他行的列表中。 这是我到目前为止的代码
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 :(得分: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
关闭流。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)
).
希望这会帮助你!