I know you can do something like this:
readlines(FileName) ->
{ok, Device} = file:open(FileName, [read]),
get_all_lines(Device, []).
get_all_lines(Device, Accum) ->
case io:get_line(Device, "") of
eof -> file:close(Device), Accum;
Line -> get_all_lines(Device, Accum ++ [Line])
end.
: Is there a one liner BIF that can do this too?
file:read_file/1 is what you are looking for. Just for teaching purpose,
Accum ++ [Line]
is bad practice. Problem is that left argument of++
is copied and right is used as is. In your code you will copy bigger and bigger part in each iteration. Solution islists:reverse(Line,Accum)
and than returnlists:reverse(Accum)
in youreof
branch (Or[Line|Accum]
andlists:append(lists:reverse(Accum))
at theeof
or use binary which have better append operation or ...). Another way is not using tail recursive function which is not so bad as seems at first time according to Myth: Tail-recursive functions are MUCH faster than recursive functions.So your
readlines/1
function should look likeYou could leverage
file:read_file/1
andbinary:split/3
to do this work in two steps: