私は現在、Cからバークレーデータベースを使っていますが、重複データの許可に関しては少し問題がありました。 DB-> set_flagsで重複した項目を許可せず、データベース内の項目をカーソルで繰り返し処理すれば、すべてうまく動作します。私のプログラムで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);
}
誰でも追加する必要があることを教えてください。私はBerkeley DBに関するすべての情報を持っているsourceforgeページをチェックしました。私が知る限り、重複したエントリを許可するためにDB-> set_flags行を追加するだけですが、私が見逃したことがありますか?
まず、関数が失敗する可能性がある場合は常に_戻り値をチェックする必要があります。おそらくあなたの直面する問題ではないかもしれませんが、それはまだ良い習慣です。 – paxdiablo
だから、DBpointer-> c_get呼び出しの戻り値を取得しようとしましたが、セグメンテーションフォルトが発生している理由がわかりません。 :S私がwhileループから取り出して一度呼び出すとしても、私はまだエラーが出ます。 –