我正在尝试从简单的文本文件中读取整数值。 我的输入文件中的行如下所示:
1 4 15 43
2 4 12 33
... (many rows of 4 integers)
我已按以下方式打开文件:
{ok, IoDev} = file:open("blah.txt",[read])
但我唯一能够阅读的内容是具有所有可用功能的字节。
我最终想从文件中得到的是整数元组。
{1 4 15 43}
{2 4 12 33}
...
答案 0 :(得分:3)
您必须先使用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.
(编辑)
我发现了一个使用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.
答案 1 :(得分:2)
没看过编辑过的部分
/ *
您可以尝试fread/3
read() ->
{ok, IoDev} = file:open("x", [read]),
read([], IoDev).
read(List, IoDev) ->
case io:fread(IoDev, "", "~d~d~d~d") of
{ok, [A,B,C,D]} ->
read([{A,B,C,D} | List], IoDev);
eof ->
lists:reverse(List);
{error, What} ->
failed
end.
* /