Esta es una pregunta de Erlang.Comportamiento inesperado de io: fread en Erlang
Me he encontrado con un comportamiento inesperado por io: fread.
Me preguntaba si alguien podría verificar si hay algún problema con la forma en que uso io: fread o si hay un error en io: fread.
I tienen un archivo de texto que contiene un "triángulo de números" como sigue:
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 ...
Hay un único espacio entre cada par de números y cada línea termina con un par de nueva línea de retorno de carro .
Utilizo el siguiente programa Erlang para leer este archivo en una lista.
-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.
La salida de este programa es:
([email protected])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|...]
Nota cómo el último número de la cuarta línea (34) y el primer número de la quinta línea (10) se han fusionado en un único número 3410.
Cuando vuelco el archivo de texto usando "od" no hay nada de especial en esas líneas; terminan con cr-nl al igual que cualquier otra línea:
> 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
Una observación interesante es que algunos de los números para los cuales se produce el problema pasa a ser el límite de 16 bytes en el archivo de texto (pero no todos, por ejemplo 6890).
Esto busca todo como un error. Tomando la longitud de los datos muestra que son 32 elementos, no 36 elementos. Organizar los datos en otros formatos solo mueve el problema. (Lo probé en Vista + Erland 5.6.5). – Godeke