2011-03-12 170 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