Основы программирования в Linux
Упражнение 7.14. Файл cd_data.hНачните с заголовочного файла для определения структуры ваших данных и подпрограмм, которые будут использоваться для доступа к данным.
1. Далее приведено определение структуры данных для базы данных компакт-дисков. В него включено определение структур и размеров двух таблиц, формирующих базу данных. Начните с задания размеров некоторых полей, которые вы будете применять, и двух структур: одной для элемента каталога, а другой для элемента дорожки.
/* Таблица catalog */#define CAT_CAT_LEN 30#define CAT_TITLE_LEN 70#define CAT_TYPE_LEN 30#define CAT_ARTIST_LEN 70typedef struct {char catalog[CAT_CAT_LEN + 1];char title[CAT_TITLE_LEN + 1];char type [CAT_TYPE_LEN + 1];char artist[CAT_ARTIST_LEN + 1];} cdc_entry;/* Таблица дорожек, по одному элементу на дорожку */#define TRACK_CAT_LEN CAT_CAT_LEN#define TRACK_TTEXT_LEN 70typedef struct {char catalog[TRACK_CAT_LEN + 1];int track_no;char track_txt[TRACK_TTEXT_LEN + 1];} cdt_entry;2. Теперь, имея структуры данных, можно определить нужные вам подпрограммы доступа. Функции с префиксом
в имени предназначены для элементов каталога, с префиксомcdc_— для элементов-дорожек.cdt_ПримечаниеУчтите, что некоторые функции возвращают структуры данных. Вы можете указать на аварийное завершение таких функций, сделав содержимое структур пустым.
/* Функции инициализации и завершения */int database_initialize(const int new_database);void database_close(void);/* Две функции для простого извлечения данных */cdc_entry get_cdc_entry(const char *cd_catalog_ptr);cdt_entry get_cdt_entry(const char *cd_catalog_ptr, const int track_no);/* Две функции для добавления данных */int add_cdc_entry(const cdc_entry entry_to_add);int add_cdt_entry(const cdt_entry entry_to_add);/* Две функции для удаления данных */int del_cdc_entry(const char *cd_catalog_ptr);int del_cdt_entry(const char *cd_catalog_ptr, const int track_no);/* Одна функция поиска */cdc_entry search_cdc_entry(const char *cd_catalog_ptr,int *first_call_ptr);Упражнение 7.15. Файл app_ui.cТеперь перейдем к пользовательскому интерфейсу. Вам предлагается простая программа, с помощью которой вы сможете обращаться к функциям вашей базы данных. Интерфейс реализуется в отдельном файле.
1. Как обычно, начните с некоторых заголовочных файлов:
#define _XOPEN_SOURCE#include <stdlib.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include "cd_data.h"#define TMP_STRING_LEN 125 /* это число должно быть большесамой длинной строки в структуре базы данных */2. Опишите пункты вашего меню с помощью
. Этот вариант лучше применения констант, заданных в директивахtypedef, т.к. позволяет компилятору проверить типы переменных, задающих пункт меню.#definetypedef enum {mo_invalid,mo_add_cat,mo_add_tracks,mo_del_cat,mo_find_cat,mo_list_cat_tracks,mo_del_tracks,mo_count_entries,mo_exit} menu_options;3. Теперь введите прототипы локальных функций. Помните о том, что прототипы функций, обеспечивающих реальный доступ к базе данных, включены в файл cd_data.h.
static int command_mode(int argc, char *argv[]);static void announce(void);static menu_options show_menu(const cdc_entry *current_cdc);static int get_confirm(const char *question);static int enter_new_cat_entry(cdc_entry *entry_to_update);static void enter_new_track_entries(const cdc_entry* entry_to_add_to);static void del_cat_entry(const cdc_entry *entry_to_delete);static void del_track_entries(const cdc_entry *entry_to_delete);static cdc_entry find_cat(void);static void list_tracks(const cdc_entry *entry_to_use);static void count_all_entries(void);static void display_cdc(const cdc_entry *cdc_to_show);static void display_cdt(const cdt_entry *cdt_to_show);static void strip_return(char *string_to_strip);4. И наконец, вы добрались до функции
. Она начинается с проверки того, что текущий элементmain, который применяется для сохранения дорожки выбранного в данный момент элемента каталога компакт-дисков, инициализирован. Также проводится грамматический разбор командной строки, выдается оповещение о том, какая программа выполняется, и инициализируется база данных.current_cdc_entryvoid main(int argc, char *argv[]) {