因此,我正在尝试读取和写入文件。 写入文件时,我需要检查文件中是否存在特定索引,然后才不会发生写入和抛出错误。 文件中的数据将如下所示:
{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的新手。我刚开始学习一周。
答案 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(Pid) -> {ok, Filename} | undefined
该函数可以返回undefined
,这就是错误消息所发生的意思。