用erlang读取文件的问题

时间:2018-06-24 12:04:41

标签: functional-programming erlang

因此,我正在尝试读取和写入文件。 写入文件时,我需要检查文件中是否存在特定索引,然后才不会发生写入和抛出错误。 文件中的数据将如下所示:

{1,{data,dcA,1}}.
{2, {data, dcA, 2}}.
{3,{data,dcA,3}}.

我在每行的末尾添加了点,因为file:consult()需要这样的文件。

采用这种格式。

{Index, {Data, Node, Index}}

当我必须添加新文件时,请检查该索引。

这是我到目前为止尝试过的-https://pastebin.com/apnWLk45

我这样运行:

193> {ok, P9} = poc:start(test1, self()).
{ok,<0.2863.0>}
194> poc:add(P9, Node, {6, data}).

在poc:add / 3中,P9是来自file:open的进程ID。 我之前在shell中定义为dcA 第三个是数据-格式为{Index, data}

由于我使用的是file:consult / 1,因此它将文件名作为参数。那时,我只有进程ID。所以我取这个名字 file:pid2name(_Server)

当我第一次运行它时,它运行完美。

当我再次运行此命令-poc:add(P9,Node,{6,data2})时,此行file:pid2name(_Server)中出现错误。

exception error: no match of right hand side value undefined

我该如何解决这个问题?

我是Erlang的新手。我刚开始学习一周。

1 个答案:

答案 0 :(得分:2)

  

我正在尝试读取和写入文件。在写入   文件,我需要检查文件中是否存在特定索引,然后不   写入并抛出错误。

一个DETS表可以轻松地执行您想要的操作:

-module(my).
-compile(export_all).

open_table() ->
    dets:open_file(my_data, [{type, set}, {file, "./my_data.dets"}]).

close_table() ->
    dets:close(my_data).

clear_table() ->
    dets:delete_all_objects(my_data).

insert({Key, _Rest}=Data) ->
    case dets:member(my_data, Key) of 
        true    -> throw(index_already_exists);
        false   -> dets:insert(my_data, Data)
    end.

all_items() ->
    dets:match(my_data, '$1').

在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.2  (abort with ^G)

1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:open_table().
{ok,my_data}

3> my:clear_table().
ok

4> my:all_items().
[]

5> my:insert({1, {data, a, b}}).
ok

6> my:insert({2, {data, c, d}}).
ok

7> my:insert({3, {data, e, f}}).
ok

8> my:all_items(). 
[[{1,{data,a,b}}],[{2,{data,c,d}}],[{3,{data,e,f}}]]

9> my:insert({1, {data, e, f}}).
** exception throw: index_already_exists
    in function  my:insert/1 (my.erl, line 15)
  

当我再次运行该命令-poc:add(P9,Node,{6,data2})时,出现错误   在此行文件中:pid2name(_Server):

exception error: no match of right hand side value undefined

当进程打开文件时,它会 链接 ,该进程处理文件I / O,这意味着如果打开文件的进程异常终止,I / O进程也将终止。这是一个示例:

-module(my).
-compile(export_all).

start() ->
    {ok, Pid} = file:open('data.txt', [read, write]),
    spawn(my, add, [Pid, x, y]),
    exit("bye").


add(Pid, _X, _Y) ->
    timer:sleep(1000),  %Let start() process terminate.
    {ok, Fname} = file:pid2name(Pid),
    io:format("~s~n", [Fname]).

在外壳中:

1> c(my).     
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:start().
** exception exit: "bye"
     in function  my:start/0 (my.erl, line 7)
3> 
=ERROR REPORT==== 25-Jun-2018::13:28:48 ===
Error in process <0.72.0> with exit value:
{{badmatch,undefined},[{my,add,3,[{file,"my.erl"},{line,12}]}]}

根据pid2name() docs

pid2name(Pid) -> {ok, Filename} | undefined

该函数可以返回undefined,这就是错误消息所发生的意思。