這是一個Erlang的問題。意外的io行爲:frelang在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程序將這個文件讀入列表中。
-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.
該程序的輸出是:
([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|...]
注意如何第四行(34)和第五線(10)的所述第一數量的最後一個數字已被合併成一個單一的編號3410.
當我使用「od」轉儲文本文件時,這些行沒有什麼特別之處;他們結束與CR-NL就像任何其他行:
> 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
一個有趣的現象是,一些針對出現問題恰好是在文本文件中的16字節邊界(但不是所有的數字,例如6890)。
這看起來像一個錯誤的一切。以Data的長度表示它是32個元素,而不是36個元素。以其他格式排列數據只是移動故障。 (我在Vista + Erland 5.6.5中試過)。 – Godeke 2009-01-23 19:24:27