数据管理内容,《数据管理技术》

  数据管理内容,《数据管理技术》

  的其他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依次访问数据库中的每个键值,读取数据。注意,数据不是按顺序读取的:键值没有按顺序的检索顺序;他只是以一种简单的方式遍历所有的记录。

数据管理内容,《数据管理技术》