Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
data_datum.dptr = (void*)&items_to_store[i]; data_datum.dsize = sizeof(struct.test_data); result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE); if (result != 0) { fprintf(stderr, "dbm_store failed on key %sn", key_to_use); exit(2); } }6. Далее посмотрите, сможете ли вы извлечь эти новые данные, и в заключение следует закрыть базу данных:
sprintf(key_to_use, "bu%d", 13); key_datum.dptr = key_to_use; key_datum.dsize = strlen(key_to_use); data_datum = dbm_fetch(dbm_ptr, key_datum); if (data_datum.dptr) { printf("Data retrievedn"); memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize); printf("Retrieved item — %s %d %sn", item_retrieved.misc_chars, item_retrieved.any_integer, item_retrieved.more_chars); } else { printf("No data found for key %sn", key_to_use); } dbm_close(dbm_ptr); exit(EXIT_SUCCESS);}Когда вы откомпилируете и выполните программу, вывод будет следующим:
$ <b>gcc -о dbm1 -I/usr/include/gdtm dbm1.с -lgdbm</b>$ <b>./dbm1</b>Data retrievedRetrieved item — bar 13 unlucky?Вы получите приведенный вывод, если база данных gdbm установлена в режиме совместимости. Если компиляция не прошла, возможно, вам придется изменить директиву
include$ <b>gcc -о dbm1 -I/usr/include/gdbm dbm1.с -lgdbm_compat -lgdbm</b>Как это работает
Сначала вы открываете базу данных, при необходимости создавая ее. Затем вы заполняете три элемента структуры
items_to_storeДалее вы задаете две структуры типа
datumdatumdptrdatumnulldbm_fetchДополнительные функции dbm
После знакомства с основными функциями библиотеки dbm приведем несколько оставшихся функций, применяемых при работе с базой данных dbm:
<b>int dbm_delete(DBM *database_descriptor, datum key);</b><b>int dbm_error(DBM *database_descriptor);</b><b>int dbm_clearerr(DBM *database_dascriptor);</b><b>datum dbm_firstkey(DBM *database_descriptor);</b><b>datum dbm_nextkey(DBM *database_descriptor);</b>Функция
dbm_deletedatumdbm_fetchФункция
dbm_errorФункция dbm_clearerr очищает любой флаг ошибочной ситуации, который может быть установлен в базе данных.
Эти подпрограммы обычно используются вместе для просмотра ключей всех элементов базы данных. Далее приведена структура требуемого для просмотра цикла:
DBM *db_ptr;datum key;for (key = dbm_firstkey(db_ptr); key.dptr; key = dbm_nextkey(db_ptr));Выполните упражнение 7.13.
В этом примере вы улучшите файл dbm1.с с помощью описанных новых функций и создадите новый файл dbm2.c.
1. Сделайте копию dbm1.с и откройте его для редактирования. Отредактируйте строку
#define TEST_DB_FILE<i>#unclude <unistd.h></i>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <ndbm.h>#include <string.h><i>#define TEST_DB_FILE "/tmp/dbm2_test"</i>#define ITEMS_USED 32. Теперь вам нужно внести изменения только в секцию извлечения:
/* теперь попытайтесь удалить некоторые данные */ sprintf(key_to_use, "bu%d", 13); key_datum.dptr = key_to_use; key_datum.dsize = strlen(key_to_use);<i> if (dbm_delete(dbm_ptr, key_datum) == 0) {</i>
