Functional programming 在erlang中读取文件的问题

Functional programming 在erlang中读取文件的问题,functional-programming,erlang,Functional Programming,Erlang,所以,我试图读写一个文件。 在写入文件时,我需要检查文件中是否存在特定的索引,然后我不会写入并抛出错误。 文件中的数据如下所示: {1,{data,dcA,1}}. {2, {data, dcA, 2}}. {3,{data,dcA,3}}. 193> {ok, P9} = poc:start(test1, self()). {ok,<0.2863.0>} 194> poc:add(P9, Node, {6, data}). 我在每行末尾添加了点,因为file:con

所以,我试图读写一个文件。 在写入文件时,我需要检查文件中是否存在特定的索引,然后我不会写入并抛出错误。 文件中的数据如下所示:

{1,{data,dcA,1}}.
{2, {data, dcA, 2}}.
{3,{data,dcA,3}}.
193> {ok, P9} = poc:start(test1, self()).
{ok,<0.2863.0>}
194> poc:add(P9, Node, {6, data}).
我在每行末尾添加了点,因为file:consult()需要这样的文件

就是这个格式

{Index, {Data, Node, Index}}
当我必须添加一个新文件时,我会使用这个索引进行检查

以下是我迄今为止所尝试的-

我是这样运行的:

{1,{data,dcA,1}}.
{2, {data, dcA, 2}}.
{3,{data,dcA,3}}.
193> {ok, P9} = poc:start(test1, self()).
{ok,<0.2863.0>}
194> poc:add(P9, Node, {6, data}).
我如何解决这个问题

我是新来的二郎。我刚开始学习的一周

我正试图读写一个文件。在写进 文件,我需要检查文件中是否存在特定的索引,然后我就不存在了 写入并抛出错误

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)
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}]}]}
当我再次运行这个-poc:add(P9,节点,{6,data2})时,我得到一个错误 在此行文件中:pid2name(_服务器):

当进程打开文件时,它将链接到处理文件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]).
在外壳中:

~/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)
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}]}]}
该函数可以返回未定义的
,这就是错误消息所说的情况

我正试图读写一个文件。在写进 文件,我需要检查文件中是否存在特定的索引,然后我就不存在了 写入并抛出错误

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)
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}]}]}
当我再次运行这个-poc:add(P9,节点,{6,data2})时,我得到一个错误 在此行文件中:pid2name(_服务器):

当进程打开文件时,它将链接到处理文件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]).
在外壳中:

~/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)
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}]}]}
该函数可以返回未定义的
,这就是错误消息所说的情况