读线

2014-04-02 15 views
1

我试图读取数据从RAM文件(跳过一些行前面),但功能ram_file:read_line/1似乎未实现:读线

Eshell V5.9.2 (abort with ^G) 

1> Data = "first line 
1> second_line". 
"first line\nsecond_line" 
2> {ok, File} = file:open(Data, [ram]). 
{ok,{file_descriptor,ram_file,#Port<0.504>}} 
3> file:read_line(File). 
** exception error: undefined function ram_file:read_line/1 

我试图打开其他文件指定模式:rawreadread_ahead,但它返回{error,badarg}

我知道我可以将数据读入缓冲区和迭代,但有另一种方式做到这一点?

+0

我一直在想在这里创建基于文档的单元测试在内存中的IO模块:http://erlang.org/doc/应用程序/ STDLIB/io_protocol.html。你当然可以这样做,尽管这可能比必要的工作更多。 – macintux

+0

@macintux这听起来很有趣,但是就像你写的那样,现在工作太多了。 –

回答

0

ram_file:read_line/1似乎没有在OTP中实现。我只能建议使用io:get_line/1,如果您只处理“RAM数据”,或者在ram_file模块中使用io:get_line/1执行read_line模块。

+0

对不起,试过:**异常错误:没有函数子句匹配io:request({file_descriptor,ram_file,#Port <0.504>},{get_line,unicode,[]})(io.erl,line 478)' –

+0

Yes ;你很好。我必须将'io:get_line/1'混淆在一起,并且很快提交我的答案(仅基于类型规范:/)。无论你应该看看扩展['ram_file'](https://github.com/erlang/otp/blob/maint/lib/kernel/src/ram_file.erl)模块(或基于它实现你自己的文件处理程序,就像@macintux建议的那样)如果文件处理是你的情况。如果你只是试图分解char-list,那么你可以冷视'string:tokens/2'。 – mpm

+1

请注意,':ram_file'模块目前在OTP中没有记录,因此可能会更改/删除。 – jwfearn

4

下面是打开,写入,读取和关闭RAM文件的方式。

main (IOdata) -> 
    {ok, Fd} = file:open("bla", [ram,write,read,binary]), 
    ok = file:write(Fd, IOdata), 
    {ok, Str} = file:pread(Fd, 0, 8192), 
    ok = file:close(Fd), 
    Str. 

你正在寻找的FUNC是file:pread/3

+0

我不明白这行代码'ok = file:write(Fd,IOdata),',你能解释一下吗? – BlackMamba

+0

嗯,它是在这里,我们可以从RAM文件中“预先写入”一些东西。它确保一些IO数据被写入Fd。 – fenollp

+0

我知道我可以做到这一点,主要的问题是在文件开始时跳过一些行。 –