I have a text file with some information, each line is a list of values. I want to read each line and store it in a list with all the other lines. This is the code I have so far
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]).
this is the text file 'textfile.abc'
[0.45,20,850,900,3].
[0.45,20,850,900,2].
[0.45,20,850,900,1].
When I run getLines it executes and writes '_G1147068' instead of the list of items. I'm not sure what I'm doing wrong here, any help would be appreciated.
The main reason why your code does not work the way you intend it to is found in the second clause of readData/2
(quoted below). It contains two singleton variables and [DataList|end_of_file]
is not a list (since end_of_file
is an atom).
readData(Source,[DataList|end_of_file]).
Your code can be improved in other ways as well:
close/1
for this. readData/2
succeeds, suppose your program throws an exception or fails while running readData/2
. Now close/1
will not be reached and the stream will still be open. Luckily, there is setup_call_cleanup/3
which closes the stream even if your code fails / throws an exception. read_term/3
which comes with many nice options . L = [H|T]
I make sure the T
is always a list. Resulting code:
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)
).
Hope this helps you out!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.