Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233393
  • 博文数量: 29
  • 博客积分: 878
  • 博客等级: 上士
  • 技术积分: 1114
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-12 14:49
文章分类

全部博文(29)

文章存档

2012年(29)

分类: LINUX

2012-09-02 14:36:11

写了大半突然死机,只能重新写了,简单写写。

《Linux程序第四版》
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.定义存储的数据结构。

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <fcntl.h>

  5. #include <gdbm-ndbm.h>
  6. #include <string.h>

  7. #define TEST_DB_FILE "/tmp/dbm1_test"  //定义一个文件 测试数据库
  8. #define ITEMS_USED 3

  9. struct test_data {  //用于测试数据块的结构
  10.     char misc_chars[15];
  11.     int any_integer;
  12.     char more_chars[21];
  13. };
2.创建并打开测试数据库

点击(此处)折叠或打开

  1. int main() {

  2.     struct test_data items_to_store[ITEMS_USED]; //用于存放存储的数据
  3.     struct test_data item_retrieved; //存放索引到的数据项

  4.     char key_to_use[20]; //存放关键字
  5.     int i, result;

  6.     datum key_datum; //关键字
  7.     datum data_datum;//数据项
  8.     
  9.     DBM *dbm_ptr;//指向数据库的起始

  10.     dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666)
  11.     if (!dbm_ptr) {
  12.         fprintf(stderr, "Failed to open database\n");
  13.         exit(EXIT_FAILURE);
  14.     }
3.初始化用于存储的数据项

点击(此处)折叠或打开

  1. memset(items_to_store, '\0', sizeof(items_to_store));
  2.     strcpy(items_to_store[0].misc_chars, "First!");
  3.     items_to_store[0].any_integer = 47;
  4.     strcpy(items_to_store[0].more_chars, "foo");
  5.     strcpy(items_to_store[1].misc_chars, "bar");
  6.     items_to_store[1].any_integer = 13;
  7.     strcpy(items_to_store[1].more_chars, "unlucky?");
  8.     strcpy(items_to_store[2].misc_chars, "Third");
  9.     items_to_store[2].any_integer = 3;
  10.     strcpy(items_to_store[2].more_chars, "baz");
4.为每个数据项建立一个唯一的关键字并存储数据

点击(此处)折叠或打开

  1. for (i = 0; i < ITEMS_USED; i++) {
  2.             /* build a key to use */
  3.         sprintf(key_to_use, "%c%c%d",    //关键字写入key_to_use
  4.             items_to_store[i].misc_chars[0],
  5.             items_to_store[i].more_chars[0],
  6.             items_to_store[i].any_integer);

  7.             /* build the key datum strcture */
  8.         key_datum.dptr = (void *)key_to_use;
  9.         key_datum.dsize = strlen(key_to_use);
  10.         data_datum.dptr = (void *)&items_to_store[i];
  11.         data_datum.dsize = sizeof(struct test_data);

  12.         result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);//把数据项和对应的关键字对应起来,存储到数据库中
  13.         if (result != 0) {
  14.             fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);
  15.             exit(2);
  16.         }
  17.     }
每个数据在存储时都要有一个唯一的索引。为了定义想要存储的数据和用来索引的关键字,必须设置两个datum数据类型的参数,一个用于索引一个用于实际的数据。
4.检索存储进去的数据

点击(此处)折叠或打开

  1. sprintf(key_to_use, "bu%d", 13); //输入关键字放入key_to_use,传给key_datum结构
  2.     key_datum.dptr = key_to_use;
  3.     key_datum.dsize = strlen(key_to_use);

  4.     data_datum = dbm_fetch(dbm_ptr, key_datum);//从数据库获取数据项,返回datum结构,仅仅包含指向返回数据的指针
  5.     if (data_datum.dptr) {
  6.         printf("Data retrieved\n");
  7.         memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);//将检索到的数据复制到变量中
  8.         printf("Retrieved item - %s %d %s\n",
  9.                item_retrieved.misc_chars,
  10.                item_retrieved.any_integer,
  11.                item_retrieved.more_chars);
  12.     }
  13.     else {
  14.         printf("No data found for key %s\n", key_to_use);
  15.     }

  16.     dbm_close(dbm_ptr);//关闭数据项

  17.     exit(EXIT_SUCCESS);
  18. }
    改变sprintf输入的关键字可以获取不同的数据项。
    dbm_fetch函数返回的datum类型数据里只包含指向获取数据的指针,实际数据依然保存在dbm数据库的本地存储空间中。继续调用dbm函数之前,必须把数据复制到变量中。

对于dbm数据库的操作步骤,总结有:
a.定义数据项结构和用于存储数据和检索数据的变量
b.创建并打开一个数据库
c.往存储数据的变量中想写入数据
d.为每个数据项建立唯一的与之对应的关键字
e.将数据项和关键字存入原先打开的数据库中
f.通过关键字索引数据项,并数据存入变量
阅读(4299) | 评论(0) | 转发(0) |
0

上一篇:socket(3)

下一篇:MySQL 安装配置

给主人留下些什么吧!~~