数据管理内容,《数据管理技术》
的其他dbm函数
既然我们已经看到了基本的dbm函数,我们可以简单地介绍一下dbm使用的其他函数:
int DBM _ delete(DBM *数据库_描述符,基准键);
int DBM _ error(DBM *数据库_描述符);
int DBM _ clear err(DBM *数据库_描述符);
datum DBM _ first key(DBM *数据库_描述符);
datum DBM _ next key(DBM *数据库_描述符);
dbm_delete
dbm_delete函数用于从数据库中删除记录。与dbm_fetch类似,它也需要一个datum参数,只不过它不读取数据,而是删除数据。如果成功,它将返回0。
dbm_error
dbm_error函数只是测试数据库中是否有错误,如果没有错误就返回0。
dbm_clearerr
dbm_clearerr函数清除数据库中设置的错误条件标志。
Dbm_firstkey和dbm_nextkey
这两个函数用作搜索数据库中所有项目的键值的函数。所需的循环结构如下:
DBM * db _ ptr;
基准键;
for(key=DBM _ first key(db _ ptr);key.dptrkey=DBM _ nextkey(db _ ptr));
测试-读取和删除数据
现在我们使用这些新函数来修改dbm1.c程序并得到dbm2.c程序:
1复制dbm1.c文件并编辑它。编辑#define TEST_DB_FILE行:
#包括unistd.h
#包含stdlib.h
#包含stdio.h
#包含fcntl.h
#包含ndbm.h
#包含字符串. h
#定义测试数据库文件"/tmp/dbm2测试"
#定义项目_已用3
2那么我们需要改变的就是阅读部分:
/*现在尝试删除一些数据*/
sprintf(key_to_use," bu%d ",13);
key _ datum.dptr=key _ to _ use
key _ datum . dsize=strlen(key _ to _ use);
if (dbm_delete(dbm_ptr,key_datum)==0) {
printf("带键%s的数据已删除/n ",key _ to _ use);
}
否则{
printf("没有为关键字%s/n删除任何内容",key _ to _ use);
}
for(key _ datum=DBM _ first key(DBM _ ptr);
key _ datum.dptr
key _ datum=DBM _ next key(DBM _ ptr)){
data_datum=dbm_fetch(dbm_ptr,key _ datum);
if (data_datum.dptr) {
printf("数据检索/n ");
memcpy( item_retrieved,data_datum.dptr,data _ datum . dsize);
printf("检索到的项目- %s %d %s/n ",
item_retrieved.misc_chars,
item_retrieved.any_integer,
item _ retrieved . more _ chars);
}
否则{
printf("未找到关键字%s/n的数据",key _ to _ use);
}
}
输出结果如下:
$ ./dbm2
删除了带有bu13键的数据
检索的数据
检索到的项目-第三个3 baz
检索的数据
已检索项目-优先!47英尺
操作原理
这个程序的前面部分与前面的例子相同,但是只是将数据存储在数据库中。然后我们构建一个键值来匹配第二项,并从数据库中删除它。
然后,程序使用dbm_firstkey和dbm_nextkey依次访问数据库中的每个键值,读取数据。注意,数据不是按顺序读取的:键值没有按顺序的检索顺序;他只是以一种简单的方式遍历所有的记录。