Repeated use of io:fread fails
Matthias Lang
matthias@REDACTED
Fri Oct 25 13:33:48 CEST 2002
Roger Price writes:
> I placed three integers into a file
>
> echo " 7 11 13" > /tmp/test
>
> and then tried to read the first two with the program
>
> f(File) -> {ok,Stream}=file:open(File,read),
> X=io:fread(Stream,'',"~d"),
> %% ...a comment...
> Y=io:fread(Stream,'',"~d"),
> file:close(Stream),
> io:format("X=~p. Y=~p.~n", [X,Y]) .
>
> but the result is
>
> 23> f("/tmp/test") .
> X={ok,[7]}. Y={error,fread}.
> ok
This looks like a bug in file_io_server.erl. Specifically,
get_until_loop/5 seems to insist on reading more input from the file
even when it has old input it hasn't consumed yet. There doesn't
appear to be a clause to consume the buffered input.
Suggested workaround for your problem:
f() -> f("/tmp/test").
f(File) ->
{ok,Stream}=file:open(File, [read]),
Line = io:get_line(Stream, ""),
{ok, [X], More} = io_lib:fread("~d", Line),
%% ...a comment...
{ok, [Y], _} = io_lib:fread("~d", More),
file:close(Stream),
{X, Y}.
Aside: your calls to file:open and io:fread both contain type
errors. '' is an atom, not a list.
Matthias
More information about the erlang-questions
mailing list