这是一个 Erlang 问题。
我遇到了 io:fread 的一些意外行为。
我想知道是否有人可以检查我使用 io:fread 的方式是否有问题,或者 io:fread 中是否存在错误。
我有一个包含“数字三角形”的文本文件,如下所示:
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 ...
每对数字之间有一个空格,每行以回车换行对结束。
我使用以下 Erlang 程序将此文件读入列表。
-模块(欧拉67)。 -作者(“凯尔·斯潘登”)。 -出口([解决/0])。 解决()-> {ok, File} = file:open("triangle.txt", [read]), 数据 = 读取文件(文件), 确定 = 文件:关闭(文件), 数据。 读取文件(文件)-> 读取文件(文件,[])。 读取文件(文件,数据)-> case io:fread(File, "", "~d") of {好的,[N]} -> 读取文件(文件,[N | 数据]); eof-> 列表:反向(数据) 结尾。
这个程序的输出是:
(erlide@cayle-spandons-computer.local)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|...]
请注意第四行的最后一个数字 (34) 和第五行的第一个数字 (10) 是如何合并为一个数字 3410 的。
当我使用“od”转储文本文件时,这些行没有什么特别之处;它们以 cr-nl 结尾,就像任何其他行一样:
> od -ta 三角形.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
一个有趣的观察是,出现问题的一些数字恰好位于文本文件中的 16 字节边界上(但不是全部,例如 6890)。