Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 伯克利数据库-重复条目分段错误_C_Database_Segmentation Fault_Berkeley Db - Fatal编程技术网

C 伯克利数据库-重复条目分段错误

C 伯克利数据库-重复条目分段错误,c,database,segmentation-fault,berkeley-db,C,Database,Segmentation Fault,Berkeley Db,所以我目前正在通过C开发一个伯克利数据库,我遇到了一个关于允许重复数据的小问题。如果我不允许通过DB->set_标志重复条目,并且我用光标遍历数据库中的项目,那么一切都可以正常工作。当我在我的程序中添加DB->set_flags行而不做任何更改时,我遇到了一个分段错误,我不知道如何修复它,因为它工作得很好,没有重复条目。代码如下: DB *dates_db; db_create(&dates_db, NULL, 0); dates_db->set_flags(dates_db, D

所以我目前正在通过C开发一个伯克利数据库,我遇到了一个关于允许重复数据的小问题。如果我不允许通过DB->set_标志重复条目,并且我用光标遍历数据库中的项目,那么一切都可以正常工作。当我在我的程序中添加DB->set_flags行而不做任何更改时,我遇到了一个分段错误,我不知道如何修复它,因为它工作得很好,没有重复条目。代码如下:

DB *dates_db;
db_create(&dates_db, NULL, 0);
dates_db->set_flags(dates_db, DB_DUP);
dates_db->open(dates_db, NULL, "da.idx", NULL, DB_BTREE, 0, 0664);

DBT key, data;
memset(&key, 0, sizeof(key)); 
memset(&data, 0, sizeof(data));

DBC *DBpointer;
dates_db->cursor(dates_db, NULL, &DBpointer, 0);

while(DBpointer->c_get(DBpointer, &key, &data, DB_NEXT) != DB_NOTFOUND)
{
    printf("The key is: %s\nThe data is: %s\n", (char *)key.data, (char *)data.data);
}

谁能告诉我我需要补充什么吗?我已经检查了sourceforge页面,该页面包含有关Berkeley DB的所有信息,据我所知,我只需要添加DB->set_flags行以允许重复条目,但是否有遗漏的内容?

首先,当函数可能失败时,您应该始终检查返回值

具体地说,
db\u create
set\u flags
open
cursor
都会返回错误指示

如果,正如您在评论中所指出的,是
c_get
导致了SIGSEGV,您可能需要确保光标确实正确创建

更改:

DBC *DBpointer;
dates_db->cursor(dates_db, NULL, &DBpointer, 0);
致:

这将是一个良好的开端

最好是一路走下去,使用以下方法:

#define CHKERR(x) if(rc!=0){printf("%s err=%d\n",x,rc);fflush(stdout);exit(1);}
int rc;
DB *dates_db;

rc = db_create(&dates_db, NULL, 0);
CHKERR("create");

rc = dates_db->set_flags(dates_db, DB_DUP);
CHKERR("set_flags");

rc = dates_db->open(dates_db, NULL, "da.idx", NULL, DB_BTREE, 0, 0664);
CHKERR("open");

DBT key, data;
memset(&key, 0, sizeof(key)); 
memset(&data, 0, sizeof(data));

DBC *DBpointer;
rc = dates_db->cursor(dates_db, NULL, &DBpointer, 0);
CHKERR("cursor");

while((rc = DBpointer->c_get(DBpointer, &key, &data, DB_NEXT)) != DB_NOTFOUND)
{
    CHKERR("c_get");
    printf("The key is: %s\nThe data is: %s\n", (char *)key.data, (char *)data.data);
}

根据进一步的评论,您在打开的调用中遇到错误22,这是
EINVAL
(至少在我的系统上),这意味着您的一个参数不正确

基于web搜索,在
open
调用上似乎有一些变化,范围在5到7个参数之间。有些人说它有五个参数(没有数据库指针,也没有事务指针),但同一文档中的示例代码(和)有七个参数的形式


查看您的BDB头文件,看看您应该使用哪一个是值得的。

首先,当函数可能失败时,您应该始终检查返回值

具体地说,
db\u create
set\u flags
open
cursor
都会返回错误指示

如果,正如您在评论中所指出的,是
c_get
导致了SIGSEGV,您可能需要确保光标确实正确创建

更改:

DBC *DBpointer;
dates_db->cursor(dates_db, NULL, &DBpointer, 0);
致:

这将是一个良好的开端

最好是一路走下去,使用以下方法:

#define CHKERR(x) if(rc!=0){printf("%s err=%d\n",x,rc);fflush(stdout);exit(1);}
int rc;
DB *dates_db;

rc = db_create(&dates_db, NULL, 0);
CHKERR("create");

rc = dates_db->set_flags(dates_db, DB_DUP);
CHKERR("set_flags");

rc = dates_db->open(dates_db, NULL, "da.idx", NULL, DB_BTREE, 0, 0664);
CHKERR("open");

DBT key, data;
memset(&key, 0, sizeof(key)); 
memset(&data, 0, sizeof(data));

DBC *DBpointer;
rc = dates_db->cursor(dates_db, NULL, &DBpointer, 0);
CHKERR("cursor");

while((rc = DBpointer->c_get(DBpointer, &key, &data, DB_NEXT)) != DB_NOTFOUND)
{
    CHKERR("c_get");
    printf("The key is: %s\nThe data is: %s\n", (char *)key.data, (char *)data.data);
}

根据进一步的评论,您在打开的调用中遇到错误22,这是
EINVAL
(至少在我的系统上),这意味着您的一个参数不正确

基于web搜索,在
open
调用上似乎有一些变化,范围在5到7个参数之间。有些人说它有五个参数(没有数据库指针,也没有事务指针),但同一文档中的示例代码(和)有七个参数的形式


查看您的BDB头文件,看看您应该使用哪一个是值得的。

首先,当函数可能失败时,您应该始终检查返回值。这可能不是您当前的问题,但这仍然是一个很好的做法。好的,所以我尝试获取DBpointer->c_get调用的返回值,但这就是我出现分段错误的原因,所以我甚至无法找出它是什么S即使我将它从while循环中取出并调用一次,我仍然会得到错误。首先,当函数可能失败时,您应该始终检查返回值。这可能不是您当前的问题,但这仍然是一个很好的做法。好的,所以我尝试获取DBpointer->c_get调用的返回值,但这就是我出现分段错误的原因,所以我甚至无法找出它是什么即使我把它从while循环中取出来并调用一次,我仍然会得到错误。我想可能是因为我睡眠不足,但我删除了我的评论,因为我看到你答案的最后一部分与我的评论有相同的确切信息,我想我没有读到你的答案,但我刚刚意识到你编辑了你的答案以回应我的评论。但在任何情况下,我都尝试在引号中添加名称(正如我在错误字段中所做的那样),并通过打开文件然后传递指针,但每次,我都无法编译,因为我传递的参数2来自不兼容的参数类型。我该如何解决这个问题?为什么它以前可以工作,但现在不行?@Gabe,从你的
db.h
头文件中抓取原型行。这将告诉您要使用的正确形式。好的,通过从调用中删除参数(编译器抱怨没有输入足够的参数),并通过我们得到的少量信息,我最肯定地使用了七参数格式:open(student_db,NULL,“studentsdb”,NULL,db_BTREE,db_CREATE,0664)其中,每个字段分别对应于://*指向db结构的指针//事务指针//磁盘上数据库的名称//逻辑数据库名称(可选)//数据库访问方法//数据库访问方法//unix文件模式*/而我对linux还不够了解,甚至无法找到头文件并查看它,但这不重要,因为我甚至尝试过五参数模型,编译器抱怨有几个参数的类型不正确,没有传递足够的参数。我想这可能是因为我睡眠不足,但我删除了我的评论,因为我看到你答案的最后一部分与我的评论内容完全相同,我认为我没有阅读你的答案,但我刚刚意识到你编辑了你的答案以回应我的评论。但在任何情况下,我都尝试在引号中添加名称(正如我在错误字段中所做的那样),并通过打开文件然后传递指针,但每次,我都无法编译,因为我传递的参数2来自不兼容的参数类型。我该如何解决这个问题?为什么它以前能工作,但现在不行?@Gabe,去从你的
db.h