Программирование GDBM с C

Я пытаюсь научиться программировать на gnu gdbm на C, но не могу продолжить из-за нехватки учебника, книг и т. Д., Поэтому единственное, что я должен сделать, - это пара простых кодов gdbm c api, доступных на w3. Я написал и скомпилировал следующий код с помощью двух отдельных файлов.c, но он не может извлечь данные из базы данных "testdb", поэтому, пожалуйста, скажите мне, где он идет не так. Сначала он хранит строку, а во второй части выбирает данные. Выход есть; Ключ не найден.

#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;
}

1 ответ

Включить трейлинг '\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 */

Первая версия часто предпочтительна, так как c-строки, которые не заканчиваются нулем, могут быть трудны для работы.

Надеюсь, поможет.


- Изменить 2 (извините, продолжайте думать о новых вещах):

Также обратите внимание, что если вы говорите, то есть:

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

Сохраненное значение будет "testv".

Другие вопросы по тегам