[erlang-questions] Unexpected behavior by io:fread.

Bengt Kleberg bengt.kleberg@REDACTED
Tue Jan 27 12:18:56 CET 2009


Greetings,

I modified your program to skip white space before reading the first
item. Like this:
read_file(File) ->
io:fread(File, "", " "),
read_file(File, []).

Now the behavior is consistently wrong in the same way:
[5973,
       4152,
       40,
       926,
       53,
       6,
       3410,
       51,
       87,
       86,
       8161,
       95,
       66,
       57,
       25,
       6890,
       81,
       80,
       38,
       92,
       67,
       7330,
       28,
       51,
       76,
       81,
       18,
       75,
       44]

This is for erl -version
Erlang (ASYNC_THREADS,HIPE) (BEAM) emulator version 5.5.5


bengt

On Sat, 2009-01-24 at 00:10 +0000, cayle.spandon@REDACTED wrote:
> I have run into some unexpected behavior by io:fread.
> 
> I was wondering if someone could check whether there is something
> wrong with the way I use io:fread or whether there is a bug in
> io:fread.
> 
> I have a text file which contains a "triangle of numbers"as follows:
> 
> <pre>
> 59
> 73 41
> 52 40 09
> 26 53 06 34
> 10 51 87 86 81
> 61 95 66 57 25 68
> 90 81 80 38 92 67 73
> 30 28 51 76 81 18 75 44
> ...
> </pre>
> 
> There is a single space between each pair of numbers and each line
> ends with a carriage-return new-line pair.
> 
> I use the following Erlang program to read this file into a list.
> 
> <pre>
> -module(euler67).
> -author('Cayle Spandon').
> 
> -export([solve/0]).
> 
> solve() ->
> {ok, File} = file:open("triangle.txt", [read]),
> Data = read_file(File),
> ok = file:close(File),
> Data.
> 
> read_file(File) ->
> read_file(File, []).
> 
> read_file(File, Data) ->
> case io:fread(File, "", "~d") of
> {ok, [N]} -> 
> read_file(File, [N | Data]);
> eof ->
> lists:reverse(Data)
> end.
> </pre>
> 
> The output of this program is:
> 
> <pre>
> (erlide@REDACTED)30> euler67:solve().
> [59,73,41,52,40,9,26,53,6,3410,51,87,86,8161,95,66,57,25,
> 6890,81,80,38,92,67,7330,28,51,76,81|...]
> </pre>
> 
> Note how the last number of the fourth line (34) and the first number
> of the fifth line (10) have been merged into a single number 3410.
> 
> When I dump the text file using "od" there is nothing special about
> those lines; they end with cr-nl just like any other line:
> 
> <pre>
> > od -t a triangle.txt
> 0000000 5 9 cr nl 7 3 sp 4 1 cr nl 5 2 sp 4 0
> 0000020 sp 0 9 cr nl 2 6 sp 5 3 sp 0 6 sp 3 4
> 0000040 cr nl 1 0 sp 5 1 sp 8 7 sp 8 6 sp 8 1
> 0000060 cr nl 6 1 sp 9 5 sp 6 6 sp 5 7 sp 2 5
> 0000100 sp 6 8 cr nl 9 0 sp 8 1 sp 8 0 sp 3 8
> 0000120 sp 9 2 sp 6 7 sp 7 3 cr nl 3 0 sp 2 8
> 0000140 sp 5 1 sp 7 6 sp 8 1 sp 1 8 sp 7 5 sp
> 0000160 4 4 cr nl 8 4 sp 1 4 sp 9 5 sp 8 7 sp
> </pre>
> 
> One interesting observation is that some of the numbers for which the
> problem occurs happen to be on 16-byte boundary in the text file (but
> not all, for example 6890).
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list