2012-09-12 7 views
0

gnu gdbm 프로그래밍을 배우려고하는데 gdbm 튜토리얼, 책 등의 부족으로 인해 진행할 수 없으므로 따라야 할 유일한 것은 몇 가지 간단한 gdbm c api 코드입니다 w3에서 사용 가능. 나는 두 개의 분리 된 .c 파일을 사용하여 다음 코드를 작성하고 컴파일했지만 데이터베이스 "testdb"에서 데이터를 가져올 수 없으므로 어디서 잘못되었는지 말해주십시오. 먼저 은 문자열을 저장하고 두 번째 부분에서는 데이터를 가져옵니다. 출력은; 키를 찾을 수 없습니다.gdbm 프로그래밍 with C

#include <stdio.h> 
#include <gdbm.h> 
#include <stdlib.h> 
#include <string.h> 

int 
main(void) 
{ 
    GDBM_FILE dbf; 
    datum key = { "testkey", 7 };  /* key, length */ 
    datum value = { "testvalue", 9 }; /* value, length */ 

    printf ("Storing key-value pair... \n"); 

    dbf = gdbm_open("testdb", 0, GDBM_NEWDB,0666, 0); 
    gdbm_store (dbf, key, value, GDBM_INSERT); 
    printf ("key: %s size: %d\n", key.dptr, key.dsize); 
    gdbm_close (dbf); 
    printf ("done.\n\n"); 

    dbf = gdbm_open("testdb", 0, GDBM_READER, 0666, 0); 
    if (!dbf) 
    { 
     fprintf (stderr, "File %s either doesn't exist or is not a gdbm file.\n", "testdb"); 
     exit (1); 
    } 

    key.dsize = strlen("testkey") + 1; 

    value = gdbm_fetch(dbf, key); 

    if (value.dsize > 0) { 
     printf ("%s\n", value.dptr); 
     free (value.dptr); 
    } 
    else { 
     printf ("Key %s not found.\n", key.dptr); 
    } 
    gdbm_close (dbf); 

    return 0; 
} 

답변

0

'\ 0'의 길이를 뒤에 넣습니다.

datum key = { "testkey", 8 };  /* key, length */ 
    datum value = { "testvalue", 10 }; /* value, length */ 

- 편집 : 당신이 언급 링크에 관해서

: "나는 있으리라 믿고있어 그 키를 쓴 과정과 : http://www-rohan.sdsu.edu/doc/gdbm/example.html

조심스럽게 첫 번째 글 머리 읽기 데이터는 종료 널 문자를 포함합니다 ... "

그래서; 중 하나 :

datum key = { "testkey", 8 }; /* Include \0 in length */ 
datum value = { "testvalue", 10 }; 

그리고 :

key.dsize = strlen("testkey") + 1; /* +1 for the trailing \0 */ 

또는

datum key = { "testkey", 7 }; /* Skip \0 in length */ 
datum value = { "testvalue", 9 }; 

그리고 :

key.dsize = strlen("testkey"); /* Do not +1 */ 

F irst 버전은 null로 끝나지 않는 c-string으로 선호되는 경우가 많습니다.

희망이 있습니다.


- 편집 2 (죄송합니다, 새로운 것을 생각 유지) :

또한 즉를 : 말한다면

datum value = { "testvalue", 5 }; /* value, length */ 

저장된 값이 "testv"이 될 것이라고 있습니다.

+0

** 친절한 도움을 주셔서 대단히 감사합니다. ** 이제 괜찮습니다. 그러면 원하는 출력이 제공됩니다. 다음 두 개의 .c 파일에서 내용을 가져 왔습니다. http://www.network-theory.co.uk/docs/gccintro/gccintro_22.html이 파일을 기반으로 작성한 데이터 및 가져 오기 부분을 저장하는 데 사용되었습니다. http : //www-rohan.sdsu.edu/doc/gdbm/example.html 나는 그들이 왜 보이지 않는지 그들의 코드 (network-theory.co.uk)에 두 개의 문자열 끝에 NULL 문자를 추가하지 않은지 궁금하다. '\ 0'없이 데이터를 저장한다. – Bishnu

+0

** 다시 한 번 감사드립니다. ** 요점이 있습니다. 나는 지난 24 시간 동안 문제를 풀려고 노력하면서 피로감으로 인해이를 눈치 채지 못했습니다 (때로는 gdb-gdb가 키 크기가 <0이었고 이유를 찾을 수없는 것으로 나타났습니다). 그러나 당신의 도움과 호의없이, gdbm이나 c에서 어떤 경험도 없기 때문에 나는 그것을 풀 수 없을 것입니다. 감사. – Bishnu

+0

@ 비슈누 : 오신 것을 환영합니다. 이 페이지가 유용 할 수도 있습니다 : http://stackoverflow.com/tags/c/info.C 프로그래밍 언어 (Second Edition) "를 읽어 보시기 바랍니다. (C89 표준을 위해 작성되었지만 마음에 들지만 여전히 책입니다.) 또한 "전문가 C 프로그래밍 : Deep C Secrets"에는 언어와 그 역사에 대한 흥미로운 사실이 몇 가지 있습니다. "왜 그런가?"- 학습 할 때 매우 유용 할 수 있습니다. – Morpfh