2011-03-12 118 views
1

我有以下代码:二进制列出奇怪的输出

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? 

谢谢。

回答

4

你可能不应该依赖于单参数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 or ~w~n

1> C="~p". 
"~p" 
2> io:format("~p~n", [C]). 
"~p" 
ok 
1

它很好地工作在这里:

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

io:format/1的参数是一个格式字符串必须不包括任何格式控制序列这需要参数。如果发生这种情况,则会产生错误。要输出原始可打印字符,请使用io:put_chars/1