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

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

Жанры

Основы программирования в 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",

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

Лев Толстой

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Лев Толстой

Возвращение Томаса. Башня-2 (сборник)

Никитин Юрий Александрович
Фантастика:
фэнтези
7.00
рейтинг книги
Возвращение Томаса. Башня-2 (сборник)

На горах

Мельников-Печерский Павел Иванович
Проза:
классическая проза
8.87
рейтинг книги
На горах

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Криптограммы Востока (сборник)

Рерих Елена Ивановна
Рерихи. Избранное
Религия и эзотерика:
эзотерика
религия
6.25
рейтинг книги
Криптограммы Востока (сборник)

Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Коллектив авторов
Warhammer Fantasy Battles
Фантастика:
фэнтези
5.00
рейтинг книги
Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Две могилы

Престон Дуглас
12. Пендергаст
Детективы:
триллеры
прочие детективы
8.90
рейтинг книги
Две могилы

Орленев

Мацкин Александр Петрович
Жизнь в искусстве
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Орленев

Экспансия – I

Семенов Юлиан Семенович
10. Штирлиц
Детективы:
политические детективы
6.33
рейтинг книги
Экспансия – I

Александр III и его время

Толмачев Евгений Петрович
Научно-образовательная:
история
культурология
5.00
рейтинг книги
Александр III и его время

Параллельные миры

Каку Митио
Научно-образовательная:
прочая научная литература
8.11
рейтинг книги
Параллельные миры

12 великих комедий

Шекспир Уильям
Вожди Советского Союза
Проза:
классическая проза
6.25
рейтинг книги
12 великих комедий

Земля в цвету

Сафонов Вадим Андреевич
Научно-образовательная:
история
биология
ботаника
5.00
рейтинг книги
Земля в цвету

Ледовый апокалипсис

Ладлэм Роберт
7. Прикрытие-Один
Детективы:
триллеры
5.00
рейтинг книги
Ледовый апокалипсис