2

DBDにしたファイルシステムから変更しています。

そして、これらの構造をDBDファイルに挿入するために、文字ポイントメンバーを持つ構造を変換する選択肢がありませんでした。

例として、以下のような構造がある場合

typedef struct
{
    int   IndexKey;
    int   groupID;
    char* name;
    char* pNum;
    char* pAddr;
    char* pMemo;
} TsomeRec;

以下のように変換する構造を作りました

typedef struct
{
    int   IndexKey;
    int   groupID;
    char  name[MAX_NAME_LEN];
    char  pNum[MAX_NUM_LEN];
    char  pAddr[MAX_ADDR_LEN];
    char  pMemo[MAX_MEMO_LEN];
} TsomeRec2;

しかし、変換するには構造が多すぎます。

そのため、パフォーマンスを考慮して、これらの構造をDBDファイルに挿入する最も効率的な方法を探しています。

率直に言って、私は熟練していません。できるだけ具体的に説明してください。

ありがとう〜

4

3 に答える 3

2

次の構造を挿入する場合:

struct S
{
char* string1;
char* string2;
}



char* p=malloc( (sizeof(size_t) + strlen(s.string1)+ sizeof(size_t) + strlen(s.string2));
size_t i=0;
size_t len1=strlen(s.string1);
memcpy(&len1,&p[i],sizeof(size_t)); i+=sizeof(size_t);
memcpy(&s.string1,&p[i],strlen(s.string1)); i+=strlen(s.string1);
size_t len2=strlen(s.string2);
memcpy(&len2,&p[i],sizeof(size_t)); i+=sizeof(size_t);
memcpy(&s.string2,&p[i],strlen(s.string1)); i+=strlen(s.string2);    

次に、「p」を使用してキー/データを BDB に保存し、free(p)

読み取るには、データを戻し、文字列のサイズを読み取り、必要なメモリをmallocし、文字列自体を読み取ります

于 2011-11-14T01:31:00.290 に答える
0

データをシリアライズ可能にする必要があります。質問の1つのケースでそれを行いました。多くのタイプのレコードに対して一般的な方法でこれを行うことは、C++ と BDB に習熟している誰かの仕事です (私は以前にやったことがあります)。あなたは自分が熟練していないことを示しているように見えました。したがって、自分でやりたい場合は、単調に聞こえる各構造を変換する必要があります (多すぎるとおっしゃいました) が、少なくとも必要なスキルは少なくなります。

あなたが探しているソリューションは複雑すぎて作成できず、ここに投稿するには長すぎます。

于 2012-01-03T21:31:53.273 に答える
0

構造のデフォルト値を設定してみることができると思います

struct a
{
    a() : i(X),j(Y){}

    int i;
    int j;
};

またはあなたの構造に列挙をする

struct X {
enum Colour { red, blue } colour;
};

int main(void)
{
struct X x;

x.colour = blue;

return 0;
}

うまくいけば、これが役立ちます

于 2011-11-14T01:20:07.580 に答える