0

我正在使用 erlang 编写一个 escript,并且我已经看到了许多带有文件 io 的示例,但并不那么容易理解,所以我发现了这个:

Text = file:read_file("f.txt"),
io:format("~n", Text).

以某种方式工作,它确实打印文件内容,然后出现多个错误

in call from erl_eval:do_apply/6 (erl_eval.erl, line 572)
in call from escript:eval_exprs/5 (escript.erl, line 850)
in call from erl_eval:local_func/5 (erl_eval.erl, line 470)
in call from escript:interpret/4 (escript.erl, line 768)
in call from escript:start/1 (escript.erl, line 277)
in call from init:start_it/1 (init.erl, line 1050)
in call from init:start_em/1 (init.erl, line 1030)

那么读取整个文件并将内容存储在数组或列表中以供以后使用的最简单方法是什么?

4

2 回答 2

1

首先,file:read_file/1 将在成功时返回 {ok, Binary},其中 Binary 是表示文件内容的二进制文件。出错时,返回 {error, Reason}。因此,您的 Text 变量实际上是一个元组。简单的修复(如果出现错误则崩溃):

{ok, Text} = file:read_file("f.txt")

接下来,io:format/2 的第一个参数是格式字符串。~n 是一种表示“换行符”的格式,但您没有给它一个表示其他任何含义的格式,因此它不期望 Text 作为参数。此外,格式字符串的所有参数都应该在作为第二个参数传递的列表中。~s 表示字符串,所以:

io:format("~s~n", [Text])

将打印出整个文件,然后是换行符。如果你想传递多个参数,它看起来像:

io:format("The number ~B and the string ~s~n", [100, "hello"])

注意 io:format/2 只有两个参数;一个恰好是一个包含多个条目的列表。

于 2013-01-21T22:48:20.087 回答
0

由于您的问题要求一种将文件内容读入数据结构的简单方法,因此您可能会喜欢 file:consult/1。此解决方案假定您可以控制文件的格式,因为 Consult/1 期望文件包含以“.”结尾的行。它返回 {ok, [terms()]} | {错误,原因}。

因此,如果您的文件 t.txt 包含以“.”结尾的行 如下:

'this is an atom'.
{person, "john", "smith"}.
[1,2,3].

那么你可以利用 file:consult/1

1> file:consult("c:\t.txt").
2> {ok,['this is an atom',{person,"john","smith"},[1,2,3]]}
于 2013-01-22T15:23:52.367 回答