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

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

Жанры

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

 prefresh(pad_ptr, 5, 7, 2, 2, 9, 9);

 sleep(1);

 prefresh(pad_ptr, LINES + 5, COLS + 7, -5, 5, 21, 19);

 sleep(1);

 delwin(pad_ptr);

 endwin;

 exit(EXIT_SUCCESS);

}

Выполнив эту программу, вы увидите нечто подобное показанному на рис. 6.8.

Рис. 6.8

Приложение, управляющее коллекцией компакт-дисков

Теперь, когда вы узнали о средствах, которые предлагает библиотека curses, можно разработать типовое приложение. Далее приведена его версия, написанная на языке С и использующая библиотеку curses. К достоинствам приложения относятся более четкое отображение информации на экране и применение окна с прокруткой для просмотра списков.

Все приложение занимает восемь страниц, поэтому мы разделили его на секции и отдельные функции внутри секций. Исходный код программы curses_app.c можно получить на Web-сайте издательства Wrox . Как и все программы из этой книги, оно подчиняется требованиям Общедоступной лицензии проекта GNU.

Примечание

Мы написали эту версию приложения для работы с базой данных компакт-дисков, используя информацию из предыдущих глав. Данное приложение — потомок оригинального сценария командной оболочки, приведенного в главе 2. Оно не перепроектировалось для написания на языке С, поэтому вы увидите в этой версии многие подходы, заимствованные из сценария. Учтите, что в этой реализации есть существенные ограничения, которые мы устраним в последующих модификациях.

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

Начало нового приложения для работы с коллекцией компакт-дисков

Первая секция программного кода просто связана с объявлениями переменных и функций, которые вы будете применять позже, и инициализацией некоторых структур данных.

1. Включите в программу все приведенные заголовочные файлы и несколько глобальных переменных:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <curses.h>

#define MAX_STRING 80 /* Самый длинный допустимый ответ */

#define MAX_ENTRY 1024 /* Самый длинный допустимый элемент БД */

#define MESSAGE_LINE 6 /* В этой строке разные сообщения */

#define ERROR LINE 22 /* Строка для вывода ошибок */

#define Q_LINE 20 /* Строка для вопросов */

#define PROMPT_LINE 18 /* Строка для вывода приглашения */

2. Теперь вам нужны глобальные переменные. Переменная

current_cdis
применяется для хранения названия текущего компакт-диска, с которым вы работаете в данный момент. Она инициализируется так, что первый символ равен
NULL
, чтобы показать, что компакт-диск не выбран. Символ завершения
\0
, строго говоря, не обязателен, но он гарантирует инициализацию переменной, что само по себе хорошая вещь. Переменная
current_cat
применяется для записи номера текущего компакт-диска в каталоге:

static char current_cd[MAX_STRING] = "\0";

static char current_cat[MAX_STRING];

3. Теперь объявите имена файлов. Для простоты в этой версии имена файлов фиксированные, как и имя временного файла.

Это может вызвать проблемы, если программа выполняется двумя пользователями в одном и том же каталоге. Лучше получать имена файлов базы данных как аргументы программы или из переменных окружения. Нам также потребуется улучшенный метод генерации уникального имени временного файла, для чего мы могли бы использовать функцию

tmpnam
из стандарта POSIX. Мы обратимся к решению многих из этих проблем в главе 8, когда применим СУРБД MySQL для хранения данных.

const char *title_file = "title.cdb";

const char *tracks_file = "tracks.cdb";

const char *temp_file = "cdb.tmp";

4. И наконец, прототипы функций:

void clear_all_screen(void);

void get_return(void);

int get_confirm(void);

int getchoice(char *greet, char *choices[]);

void draw_menu(char *options[], int highlight,

 int start_row, int start_col);

void insert_title(char *cdtitle);

void get_string(char *string);

void add_record(void);

void count_cds(void);

void find_cd(void);

void list_tracks(void);

void remove_tracks(void);

void remove_cd(void);

void update_cd(void);

5. Прежде чем рассматривать их реализацию, введем некоторые структуры (на самом деле массив пунктов меню) для хранения меню. Когда выбирается пункт меню, возвращается первый символ выбранного пункта. Например, если это пункт меню add new CD (добавить новый CD), при его выборе будет возвращен символ

а
. Когда компакт-диск выбран, будет отображаться расширенное меню.

char *main_menu[] = {

 "add new CD",

 "find CD",

 "count CDs and tracks in the catalog",

 "quit",

 0,

};

char *extended_menu[] = {

 "add new CD",

 "find CD",

 "count CDs and tracks in the catalog",

 "list tracks on current CD";

 "remove current CD",

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

Закрытые Миры

Муравьёв Константин Николаевич
Вселенная EVE Online
Фантастика:
фэнтези
5.86
рейтинг книги
Закрытые Миры

Я С СССР! Том III

Вязовский Алексей
3. Я спас СССР
Фантастика:
альтернативная история
5.86
рейтинг книги
Я С СССР! Том III

Личный аптекарь императора. Том 3

Карелин Сергей Витальевич
3. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 3

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Болезни ног и варикозное расширение вен. Лечение и профилактика

Нестерова Дарья Владимировна
Дом и Семья:
здоровье и красота
6.25
рейтинг книги
Болезни ног и варикозное расширение вен. Лечение и профилактика

Адептка второго плана

Мамаева Надежда Николаевна
Попасть в историю
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Адептка второго плана

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Наследие Маозари 3

Панежин Евгений
3. Наследие Маозари
Фантастика:
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 3

Курс 1. Октябрь

Фокс Гарри
2. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Октябрь

Слово мастера

Лисина Александра
11. Гибрид
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Слово мастера