[闲聊] 建立纪录档的注意事项

楼主: laechan (挥泪斩马云)   2022-10-12 23:36:28
这里单纯使用 write_file,其它 log 档函数类似。
例如说在 /open/log/ 目录下我们欲建立一个 eat_pill.log 档,
它是基于玩家拿到 /d/obj/big_pill.c (属性大补帖) 后,使用了
eat pill 指令去服用这颗药丸的纪录,那通常函数是这样写的:
int eat_pill(string str)
{
.
. 中略
.
write("你服下这颗药丸后,感觉精力充沛,浑身充满了干劲!!\n");
write_file("/open/log/eat_pill.log",sprintf("%-12s : %s\n",
this_player()->query("name"),ctime(time()));
this_object()->remove();
return 1;
}
那它会产生什么问题呢?就是后继者看到这个档案时
1. 它不晓得这个档案是怎么产生的
2. 它看到的时候可能档案大小已高达数MB
针对第一点,可以改写成底下程式段:
names=this_player()->query("name");
t=ctime(time());
str="";
if(!file_exists("/open/log/eat_pill.log"))
str="/d/obj/big_pill.c eat pill 专用 log 档\n"+
"======================================================\n";
write_file("/open/log/eat_pill.log",sprintf("%s%-12s : %s\n",
str,names,t);
也就是说,如果这个档案不存在,它在产生这个档案的当下,
会在档头附加一段说明文字,让后继者可以知道,这个档案的
产生,是从 /d/obj/big_pill.c 这里来的。
针对第二点,有两种做法,一种是使用 file_size 函数,即
if(file_size("/open/log/eat_pill.log") > 某值)
rm("/open/log/eat_pill.log");
然后再接上面针对第一点所写的程式段即可,这时因为 rm 掉
了,它就会产生新的档案并加上表头,同时因为 rm 掉了产生
的新档案,其 size 还很小,后面陆续添加内容时也不会短时
间 > 某值,就能继续 log 下去。
还有一种做法是 rename
if(file_size("/open/log/eat_pill.log") > 某值)
{
rm("/open/log/eat_pill.old");
rename("/open/log/eat_pill.log","/open/log/eat_pill.old");
}
它会先去砍 .old 档(如果有的话),再把 .log 档 rename 成 .old 档
通常当复数个地方需要使用到 log 档时,将以上的处理包成一
个函数是比较好的做法,需要 log 时就呼叫同一函数来处理,
这样对后继者会是比较友善的做法。
最近因为在 sanc 又使用了 log 档,顺便规划了日后欲采行的
做法,那其实 sanc 目前没后继者,说穿了就是对相当容易健忘
的我来说,是需要采行这种做法的。
(有几个纪录档我就忘记程式段是写在哪些物件上了)
Laechan
作者: tsetsethatha (吉星麦造~~~我来了)   2022-10-13 05:43:00
感谢分享经验谈!收录于精华区z-3-10-30,再次感谢l大 :D
作者: tsetsethatha (吉星麦造~~~我来了)   2022-10-13 05:43:00
感谢分享经验谈!收录于精华区z-3-10-30,再次感谢l大 :D
作者: tsetsethatha (吉星麦造~~~我来了)   2022-10-12 21:43:00
感谢分享经验谈!收录于精华区z-3-10-30,再次感谢l大 :D

Links booklink

Contact Us: admin [ a t ] ucptt.com