これはアーランの質問です。
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 ...
数値の各ペアの間には 1 つのスペースがあり、各行はキャリッジ リターンと改行のペアで終わります。
次の Erlang プログラムを使用して、このファイルをリストに読み込みます。
-モジュール(euler67)。 -作者('ケイル・スパンドン'). -export([解決/0])。 解決する() -> {ok, ファイル} = file:open("triangle.txt", [読み取り]), データ = read_file(ファイル)、 ok = file:close(ファイル), データ。 read_file(ファイル) -> read_file(ファイル、[])。 read_file(ファイル、データ) -> case io:fread(File, "", "~d") の {わかりました、[N]} -> read_file(ファイル, [N | データ]); eof -> リスト:reverse(データ) 終わり。
このプログラムの出力は次のとおりです。
(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|...]
4 行目の最後の数字 (34) と 5 行目の最初の数字 (10) が 1 つの数字 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
興味深い観察結果の 1 つは、問題が発生する数値の一部がたまたまテキスト ファイル内の 16 バイト境界にあることです (ただし、6890 など、すべてではありません)。