Ошибка Erlang: нет предложения функции, соответствующего вводу-выводу: запросу

#erlang

#erlang

Вопрос:

Я опытный программист, новичок в Erlang, и я застрял на следующем:

 myread() ->
    {_, MyData } = file:read_file( "hands.txt" ),
    io:format( "hands-out.txt", "~w", MyData ).
  

выдает, когда myread() вызывается из оболочки:

 ** exception error: no function clause matching io:request("hands-out.txt",
          {format,"~w", <<"3h 5h 7h 8h 3h 5h 7h 8h q"...>>}) 
      (io.erl, line 556)  in function  io:o_request/3 (io.erl, line 63)
  

Любая помощь будет оценена.

Ответ №1:

Две вещи:

"hands-out.txt", "~w" должна быть одна строка: "hands-out.txt: ~w"

и данные, которые заменяют ~w , должны быть списком. Итак:

io:format( "hands-out.txt: ~w", [MyData] ).

См. http://erlang.org/doc/man/io.html#format-2

Кроме того, вы должны сопоставить шаблон со значением статуса в возврате from file:read_file/1 . В вашей версии ошибка, которая будет возвращена как {error, Reason} будет соответствовать here, поскольку вы используете _ , и вы бы напечатали причину ошибки, а не файл, что может сбить с толку.

Так что либо сделайте это {ok, MyData } = file:read_file( "hands.txt" ) , если вы хотите аварийно завершить работу при ошибке чтения, либо что-то вроде следующего, если вы хотите справиться с этим случаем:

 myread() ->
  case file:read_file( "hands.txt" ) of
    {ok, MyData } ->
      io:format( "hands-out.txt: ~w", [MyData] );
    {error, Error} ->
      io:format("Error: ~w~n", [Error])
  end.