あなたが最初のテキストの行を読み取るためにfile:read_line/1
を使用して、数字を含む文字列のリストを取得するにはre:split/2
を使用する必要があります。次に、list_to_integer
BIFを使用して整数を取得します。
はここで(確かに、より良い解決策がある)例を示します
#!/usr/bin/env escript
%% -*- erlang -*-
main([Filename]) ->
{ok, Device} = file:open(Filename, [read]),
read_integers(Device).
read_integers(Device) ->
case file:read_line(Device) of
eof ->
ok;
{ok, Line} ->
% Strip the trailing \n (ASCII 10)
StrNumbers = re:split(string:strip(Line, right, 10), "\s+", [notempty]),
[N1, N2, N3, N4] = lists:map(fun erlang:list_to_integer/1,
lists:map(fun erlang:binary_to_list/1,
StrNumbers)),
io:format("~w~n", [{N1, N2, N3, N4}]),
read_integers(Device)
end.
(EDIT)
私は書式付き入力を読み取るためにio:fread
を使用して、やや簡単な解決策を見つけました。それはあなたのケースではうまくいくが、ファイルがひどく建設されているとひどく失敗する。
#!/usr/bin/env escript
%% -*- erlang -*-
main([Filename]) ->
{ok, Device} = file:open(Filename, [read]),
io:format("~w~n", [read_integers(Device)]).
read_integers(Device) ->
read_integers(Device, []).
read_integers(Device, Acc) ->
case io:fread(Device, [], "~d~d~d~d") of
eof ->
lists:reverse(Acc);
{ok, [D1, D2, D3, D4]} ->
read_integers(Device, [{D1, D2, D3, D4} | Acc]);
{error, What} ->
io:format("io:fread error: ~w~n", [What]),
read_integers(Device, Acc)
end.
おかげで、私はこれがそうなると思う試すことができます編集した部分
/*
を見ていません。私は常にファイルパッケージを調べていましたが、ioに相談したことはありませんでした。ありがとう! – lucafik