2007/05/03

erlang その4

●ファイル
ファイルの入出力の方法について調べてみた。
まずは、ファイルからの読み込み。
<tut11.erl>

-module(tut11).
-export([read/1]).

read(FileName)->
Handle = file:open(FileName, read),
if element(1,Handle) /= ok -> element(1, Handle);
true -> show_content(element(2,Handle)),
file:close(element(2, Handle))
end.

show_content(Handle)->
Result = io:get_line(Handle, prompt),
if Result == eof -> ok;
true -> io:format("~p~n",[Result]),
show_content(Handle)
end.

さらにテスト用のファイルを作成する。
<test1.txt>
abc
def
123

コンパイルして、
6> c(tut11).
{ok,tut11}

実行すると、
7> tut11:read("test1.txt").
"abc\n"
"def\n"
"123\n"
ok

のような結果が得られる。
io:get_lineでは改行コードは除去されないようだ。

次にファイルへの書き出しを試してみる。
ついでにio:formatの~pと~wと~sの違いを見てみる。
<tut12.erl>
-module(tut12).
-export([write/2]).

write(FileName, Str)->
Handle = file:open(FileName, write),
if element(1,Handle) /= ok -> element(1, Handle);
true -> write_content(element(2,Handle), Str),
file:close(element(2, Handle))
end.

write_content(_, [])->ok;
write_content(Handle, [Head|Rest])->
io:format(Handle, "~p,~w,~s~n", [[Head],[Head],[Head]]),
write_content(Handle, Rest).

コンパイルして、
36> c(tut12).
{ok,tut12}

実行してみる。
41> tut12:write("test2.txt", ["abc"]).
出力されたファイルの内容は、
["abc"],[[97,98,99]],abc

つまり、
~p : 入力された内容をそのまま出力。
~w : 各文字を値として解釈
~s : 文字列として解釈
ということになるようだ。(詳しくはerlangのreference manualを参照のこと)

今度は、日本語に挑戦。
ただ、erlang shellは日本語を受け付けてくれないので、
UTF-8の文字コードを直接入力してみる。

42> tut12:write("test2.txt", [227,129,130]).
出力されたファイルの内容は、
"�",[227],
[129],[129],�
[130],[130],�

ん?各値ごとに出力しようとしているようだ。

["abc"]のようにするには、
46> tut12:write("test2.txt", [[227,129,130]]).
とすればよい。
この出力結果は、
[[227,129,130]],[[227,129,130]],あ

のようになる。~sの出力が日本語になっている。
むろん、UTF-8で日本語が表示できるUNIX shell等で表示させている。

0 件のコメント :