Бинарный список странного вывода - PullRequest
1 голос
/ 12 марта 2011

У меня есть следующий код:

file:write(FileId, Packet),
file:close(FileId),
{ok, FileId1} = file:open("tmp/" ++ integer_to_list(Summ), [read]),
A = file:read_file("tmp/" ++ integer_to_list(Summ)),
{_, B} = A,
io:format(binary_to_list(B));

В конце функции я вижу вывод io:format B. Но если я сделаю это:

file:write(FileId, Packet),
file:close(FileId),
{ok, FileId1} = file:open("tmp/" ++ integer_to_list(Summ), [read]),
A = file:read_file("tmp/" ++ integer_to_list(Summ)),
{_, B} = A,
S = binary_to_list(B),
io:format(S);

io:format nothing output. Why?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 12 марта 2011

Вы, вероятно, не должны полагаться на функцию io:format/1 с одним аргументом:

3> B="helo\n".  
"helo\n"
4> io:format(B).
helo
ok
5> C="~p".
"~p"
6> io:format(C).
** exception exit: {badarg,[{io,format,[<0.26.0>,"~p",[]]},
                            {erl_eval,do_apply,5},
                            {shell,exprs,6},
                            {shell,eval_exprs,6},
                            {shell,eval_loop,3}]}
     in function  io:o_request/3

Если аргумент содержит какие-либо запросы на форматирование, ваш io:format вызов может прекратиться. Я бы рекомендовал использовать строку формата, такую ​​как ~p~n или ~w~n:

1> C="~p".
"~p"
2> io:format("~p~n", [C]).
"~p"
ok
1 голос
/ 12 марта 2011

Здесь прекрасно работает:

3> {ok, FileId1} = file:open("tmp/" ++ integer_to_list(Summ), [read]),
3> A = file:read_file("tmp/" ++ integer_to_list(Summ)),
3> {_, B} = A,
3> S = binary_to_list(B),
3> io:format(S).
1213
0 голосов
/ 13 марта 2011

Аргументом io:format/1 является строка формата , которая не должна содержать никаких управляющих последовательностей форматирования, которые требуют аргументов.Если это происходит, генерируется ошибка.Для вывода необработанных печатных символов используйте io:put_chars/1.

...