【问题标题】:Reading lines from a ram file从 ram 文件中读取行
【发布时间】:2014-04-03 00:20:45
【问题描述】:

我正在尝试从 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}

我知道我可以将数据读入缓冲区并对其进行迭代,但是还有其他方法吗?

【问题讨论】:

  • 我一直在考虑根据此处的文档创建一个用于单元测试的内存 IO 模块:erlang.org/doc/apps/stdlib/io_protocol.html。你当然可以这样做,尽管这可能比必要的工作要多。
  • @macintux 这听起来很有趣,但正如你所写的那样,现在工作量太大了。

标签: erlang


【解决方案1】:

以下是打开、写入、读取和关闭 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.

你要找的函数是file:pread/3

【讨论】:

  • 这行代码看不懂ok = file:write(Fd, IOdata),,能解释一下吗?
  • 它就在这里,以便我们可以pread RAM 文件中的某些内容。它确保将一些 IOdata 写入 Fd。
  • 我知道我能做到,主要问题是在文件开头跳过了一些行。
  • file:pread/3 的第三个参数是要读取的字节数。要查找整个内存文件的长度,请参阅:stackoverflow.com/questions/43770144/…
【解决方案2】:

ram_file:read_line/1 似乎没有在 OTP 中实现。如果您只处理“ram 数据”,我唯一可以建议的是使用io:get_line/1,或者在ram_file 模块中使用io:get_line/1 实现read_line

【讨论】:

  • 抱歉,试过了:** exception error: no function clause matching io:request({file_descriptor,ram_file,#Port&lt;0.504&gt;}, {get_line,unicode,[]}) (io.erl, line 478)
  • 是的;你是莱特。我必须混淆一些关于io:get_line/1 的东西,并尽快提交我的答案(并且仅基于类型规范:/)。如果文件处理是您的情况,无论您应该查看扩展ram_file 模块(或基于它实现您自己的文件处理程序,就像@macintux 建议的那样)。如果您只是想拆分 char-list,那么您冷眼看着string:tokens/2
  • 请注意,:ram_file 模块目前在 OTP 中未记录,因此可能会更改/删除。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2019-12-02
  • 2010-11-08
  • 2017-06-28
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多