写了大半突然死机,只能重新写了,简单写写。
UBUNTU10.04
linux-2.6.32
dbm环境配置:
#sudo apt-get install libgdbm-dev 安装gdbm
包含头文件#include
命令行编译选项 gcc -o filename -I/usr/include/gdbm filename.c -lgdbm_compat -lgdbm用于包含头文件目录以及连接gdbm库。
dbm数据库基本元素是存储的数据项以及与之关联的关键字。每个dbm数据项都要有唯一对应的关键字用于索引。ndbm.h文件定义了datum数据类型来操作数据项以及关键字。包含dptr和dsize成员,用于指向数据的起始点和长度。
dbm数据库访问函数有dbm_open()、dbm_store()、dbm_fetch()、dbm_close()。分别用于打开数据库、存储数据、检索数据和关闭数据库。
dbm1.c
1.定义存储的数据结构。
点击(此处)折叠或打开
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <gdbm-ndbm.h>
- #include <string.h>
- #define TEST_DB_FILE "/tmp/dbm1_test" //定义一个文件 测试数据库
- #define ITEMS_USED 3
- struct test_data { //用于测试数据块的结构
- char misc_chars[15];
- int any_integer;
- char more_chars[21];
- };
点击(此处)折叠或打开
- int main() {
- struct test_data items_to_store[ITEMS_USED]; //用于存放存储的数据
- struct test_data item_retrieved; //存放索引到的数据项
- char key_to_use[20]; //存放关键字
- int i, result;
- datum key_datum; //关键字
- datum data_datum;//数据项
-
- DBM *dbm_ptr;//指向数据库的起始
- dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
- if (!dbm_ptr) {
- fprintf(stderr, "Failed to open database\n");
- exit(EXIT_FAILURE);
- }
点击(此处)折叠或打开
- memset(items_to_store, '\0', sizeof(items_to_store));
- strcpy(items_to_store[0].misc_chars, "First!");
- items_to_store[0].any_integer = 47;
- strcpy(items_to_store[0].more_chars, "foo");
- strcpy(items_to_store[1].misc_chars, "bar");
- items_to_store[1].any_integer = 13;
- strcpy(items_to_store[1].more_chars, "unlucky?");
- strcpy(items_to_store[2].misc_chars, "Third");
- items_to_store[2].any_integer = 3;
- strcpy(items_to_store[2].more_chars, "baz");
点击(此处)折叠或打开
- for (i = 0; i < ITEMS_USED; i++) {
- /* build a key to use */
- sprintf(key_to_use, "%c%c%d", //关键字写入key_to_use
- items_to_store[i].misc_chars[0],
- items_to_store[i].more_chars[0],
- items_to_store[i].any_integer);
- /* build the key datum strcture */
- key_datum.dptr = (void *)key_to_use;
- key_datum.dsize = strlen(key_to_use);
- data_datum.dptr = (void *)&items_to_store[i];
- data_datum.dsize = sizeof(struct test_data);
- result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);//把数据项和对应的关键字对应起来,存储到数据库中
- if (result != 0) {
- fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);
- exit(2);
- }
- }
4.检索存储进去的数据
点击(此处)折叠或打开
- sprintf(key_to_use, "bu%d", 13); //输入关键字放入key_to_use,传给key_datum结构
- key_datum.dptr = key_to_use;
- key_datum.dsize = strlen(key_to_use);
- data_datum = dbm_fetch(dbm_ptr, key_datum);//从数据库获取数据项,返回datum结构,仅仅包含指向返回数据的指针
- if (data_datum.dptr) {
- printf("Data retrieved\n");
- memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);//将检索到的数据复制到变量中
- printf("Retrieved item - %s %d %s\n",
- item_retrieved.misc_chars,
- item_retrieved.any_integer,
- item_retrieved.more_chars);
- }
- else {
- printf("No data found for key %s\n", key_to_use);
- }
- dbm_close(dbm_ptr);//关闭数据项
- exit(EXIT_SUCCESS);
- }
dbm_fetch函数返回的datum类型数据里只包含指向获取数据的指针,实际数据依然保存在dbm数据库的本地存储空间中。继续调用dbm函数之前,必须把数据复制到变量中。
对于dbm数据库的操作步骤,总结有:
a.定义数据项结构和用于存储数据和检索数据的变量
b.创建并打开一个数据库
c.往存储数据的变量中想写入数据
d.为每个数据项建立唯一的与之对应的关键字
e.将数据项和关键字存入原先打开的数据库中
f.通过关键字索引数据项,并数据存入变量