2013-01-21 112 views
0

林与二郎合作编写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) 

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

回答

1

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

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

接着,至Io的第一个参数:格式/ 2是一种格式的字符串。 〜n是一种意思是“换行符”的格式,但是您没有给出格式意味着其他任何内容,所以它不会期望Text作为参数。此外,格式字符串的所有参数都应该在作为第二个参数传递的列表中。 〜s表示字符串,因此:

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

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

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

注意如何只有两个参数IO:格式/ 2;一个恰好是包含多个条目的列表。

0

由于您的问题要求以简单的方式将文件内容读取到数据结构中,您可能会喜欢file:consult/1。此解决方案假设为,您可以控制该文件的格式,因为consult/1预计该文件由以'。'结尾的行组成。它返回{ok,[terms()]} {误差,原因}。

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

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

,那么你可以利用文件:咨询/ 1

1> file:consult("c:\t.txt"). 
2> {ok,['this is an atom',{person,"john","smith"},[1,2,3]]}