Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Сейчас заново вы создадите приложение, использующее базу данных dbm для хранения нужной вам информации, в виде файлов cd_data.h, app_ui.c и cd_access.c (упражнения 7.14–7.16).

Вы также перепишите пользовательский интерфейс в виде программы с вводом команд. Позже в этой книге интерфейс базы данных и части пользовательского интерфейса будут пересмотрены, когда будет рассматриваться реализация вашего приложения с помощью различных клиент-серверных механизмов и затем как приложения, к которому можно обращаться по сети, используя Web-обозреватель. Преобразование интерфейса в более простой строковый интерфейс позволит сосредоточиться не на нем, а на более важных частях приложения.

Примечание

В последующих главах вы не раз встретитесь с заголовочным файлом базы данных cd_data.h и функциями из файла cd_access.c. Помните о том, что некоторые дистрибутивы Linux требуют немного отличающихся формирующих опций, например, применения в вашем файле на языке С заголовочного файла gdbm-ndbm.h вместо файла ndbm.h и опций

– lgdbm_compat -lgdbm
вместо просто опции
– lgdbm
. Если в вашем дистрибутиве Linux дело обстоит именно так, вы должны внести соответствующие изменения в файлы access.с и Makefile.

Упражнение 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 70

typedef 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 70

typedef 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
. Этот вариант лучше применения констант, заданных в директивах
#define
, т.к. позволяет компилятору проверить типы переменных, задающих пункт меню.

typedef 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.

Поделиться:
Популярные книги

Далекие горизонты (сборник)

Ле Гуин Урсула Кребер
Фантастика:
фэнтези
научная фантастика
космическая фантастика
5.00
рейтинг книги
Далекие горизонты (сборник)

Язык программирования Си. Издание 3-е, исправленное

Ритчи Деннис М.
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
Язык программирования Си. Издание 3-е, исправленное

Последний герой

Грэйдо Эллениэль и Эстель
2. Последний герой
Фантастика:
фэнтези
юмористическое фэнтези
6.60
рейтинг книги
Последний герой

Трилогия «Хроники Сиалы»

Пехов Алексей Юрьевич
3. В одном томе
Фантастика:
фэнтези
9.47
рейтинг книги
Трилогия «Хроники Сиалы»

Бессонница (др.перевод)

Кинг Стивен
17. Темная Башня
Фантастика:
ужасы и мистика
8.33
рейтинг книги
Бессонница (др.перевод)

Крымская война

Семанов Сергей Николаевич
Великие войны
Проза:
историческая проза
5.00
рейтинг книги
Крымская война

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

"Фантастика 2025-77". Компиляция. Книги 1-33

Текшин Антон
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Фантастика 2025-77. Компиляция. Книги 1-33

#Бояръ-Аниме. Газлайтер. Том 36

Володин Григорий Григорьевич
36. История Телепата
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 36

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Газлайтер. Том 39

Володин Григорий Григорьевич
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
6.25
рейтинг книги
Газлайтер. Том 39

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

Гобелены Фьонавара (сборник)

Кей Гай Гэвриел
Гобелены Фьонавара
Фантастика:
фэнтези
эпическая фантастика
6.25
рейтинг книги
Гобелены Фьонавара (сборник)

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Газлайтер. Том 28