1

ファイルから読み取った Line を文字列のリストに切り込もうとしています。これにより、解決方法がわからない例外が常に発生します。

    exception error: no function clause matching string:tokens1
(<<"Cascading Style Sheets CSS are an increasingly common way for website developers to control the look\n">>," ,.",[]) in function  readTest:run/1



-module(readTest).
-export([run/1]).

open_file(FileName, Mode) ->
    {ok, Device} = file:open(FileName, [Mode, binary]),
    Device.

close_file(Device) ->
    ok = file:close(Device).

read_lines(Device, L) ->
    case io:get_line(Device, L) of
        eof ->
            lists:reverse(L);
        String ->
            read_lines(Device, [String | L])
    end.

run(InputFileName) ->
    Device = open_file(InputFileName, read),
    Data = read_lines(Device, []),
    close_file(Device),
    io:format("Read ~p lines~n", [length(Data)]),
    Bla = string:tokens(hd(Data)," ,."),
    io:format(hd(Data)).

簡単に失敗しますように。erlang を始めたばかりです。

4

2 に答える 2

1

リストに変換せずにバイナリを分割することも可能です。

Bla = binary:split(Data, [<<" ">>, <<",">>, <<".">>], [global])

binary:split / 3のドキュメントを参照してください。)

于 2012-12-17T10:04:24.057 に答える
1

バイナリ フラグでファイルを開くと、行はリスト (文字列) ではなくバイナリとして読み取られます。だからあなたのコードで

 Bla = string:tokens(hd(Data)," ,."),

hd(Data) は実際にはバイナリであるため、string:tokens がクラッシュします。file:open からバイナリ フラグを削除するか、明示的にバイナリをリストに変換することができます。

 Bla = string:tokens(binary_to_list(hd(Data))," ,."),
于 2012-12-16T02:24:05.053 に答える