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

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

Жанры

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

void remove_tracks {

 FILE *tracks_fp, *temp_fp;

 char entry[MAX_ENTRY];

 int cat_length;

 if (current_cd[0] == '\0') return;

 cat_length = strlen(current_cat);

 tracks_fp = fopen(tracks_file, "r");

 if (tracks_fp == (FILE *)NULL) return;

 temp_fp = fopen(temp_file, "w");

 while (fgets(entry, MAX_ENTRY, tracks_fp)) {

/*
Сравнивает номер в каталоге и копирует элемент, если не

найдено совпадение */

if (strncmp(current_cat, entry, cat_length) != 0)

fputs(entry, temp_fp);

 }

 fclose(tracks_fp);

 fclose(temp_fp);

 /* Удаляет файл дорожек и переименовывает временный файл */

 unlink(tracks_file);

 rename(temp_file, tracks_file);

}

Запросы к базе данных компакт-дисков

Теперь рассмотрим функции для доступа к данным, которые для упрощения доступа хранятся в паре простых файлов как поля, разделенные запятыми.

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

void count_cds {

 FILE *titles_fp, *tracks_fp;

 char entry[MAX_ENTRY];

 int titles = 0;

 int tracks = 0;

 titles_fp = fopen(title_file, "r");

 if (titles_fp) {

while (fgets(entry, MAX_ENTRY, titles_fp))

titles++;

fclose(titles_fp);

 }

 tracks_fp = fopen(tracks_file, "r");

 if (tracks_fp) {

while (fgets(entry, MAX_ENTRY, tracks_fp))

tracks++;

fclose(tracks_fp);

 }

 mvprintw(ERROR_LINE, 0,

"Database contains %d titles, with a total of %d tracks.", titles, tracks);

 get_return;

}

2. Вы потеряли аннотацию к вашему любимому компакт-диску? Не волнуйтесь! Если вы аккуратно ввели подробную информацию в базу данных, теперь можно найти перечень дорожек с помощью функции

find_cd
. Она предлагает ввести подстроку, совпадение с которой нужно искать в базе данных, и устанавливает в глобальную переменную
current_cd
заголовок найденного компакт-диска.

void find_cd {

 char match[MAX_STRING], entry[MAX_ENTRY];

 FILE *titles_fp;

 int count = 0;

 char *found, *title, *catalog;

 mvprintw(Q_LINE, 0, "Enter a string to search for in CD titles: ");

 get_string(match);

 titles_fp = fopen(title_file, "r");

 if (titles_fp) {

while (fgets(entry, MAX_ENTRY, titles_fp)) {

/* Пропускает прежний номер в каталоге */

catalog = entry;

if (found == strstr(catalog, ", ")) {

*found = '\0';

title = found + 1;

/* Стирает следующую запятую в элементе, укорачивая его

только до заголовка */

if (found == strstr(title, ", ")) {

*found = '\0';

/* Теперь проверяет, есть ли совпадающая строка */

if (found == strstr(title, match)) {

count++;

strcpy(current_cd, title);

strcpy(current_cat, catalog);

}

}

}

}

fclose(titles_fp);

 }

 if (count != 1) {

if (count == 0) {

mvprintw(ERROR_LINE, 0, "Sorry, no matching CD found. ");

}

if (count > 1) {

mvprintw(ERROR_LINE, 0,

"Sorry, match is ambiguous: CDs found. ", count);

}

current_cd[0] = '\0';

get_return;

 }

}

Хотя переменная

catalog
указывает на массив, больший чем
current_cat
, и могла бы переписать память, проверка в функции
fgets
препятствует этому.

3. Вам также нужно иметь возможность перечислить на экране дорожки выбранного компакт-диска. Для вложенных окон можно использовать директивы

#define
, применявшиеся в функции
update_cd
в предыдущем разделе.

void list_tracks {

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

Каменный град

Инин Дмитрий
3. Негодяй Аллара
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Каменный град

Инновационная сложность

Колектив "Правова група "Домініон"
Детские:
детская образовательная литература
5.00
рейтинг книги
Инновационная сложность

Сказки

Уайльд Оскар
1986. Антология детской литературы
Детские:
сказки
5.00
рейтинг книги
Сказки

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

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

Гарри Поттер и Обитель Бессмертия

akchiskosan
Проект «Поттер-Фанфикшн»
Приключения:
прочие приключения
6.43
рейтинг книги
Гарри Поттер и Обитель Бессмертия

Deus vult

Рокотов Алексей
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Deus vult

Юся и эльф

Демина Карина
Фантастика:
юмористическое фэнтези
детективная фантастика
6.25
рейтинг книги
Юся и эльф

Миллион приключений (сборник)

Булычев Кир
15. Отцы-основатели - Русское пространство. Кир Булычев - Собрание сочинений
Фантастика:
научная фантастика
7.00
рейтинг книги
Миллион приключений (сборник)

Влюблен без памяти

Лисенкова Ольга
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Влюблен без памяти

Эмиссар

Листратов Валерий
8. Ушедший Род
Фантастика:
боевая фантастика
аниме
попаданцы
7.50
рейтинг книги
Эмиссар

«Химия и жизнь». Фантастика и детектив. 1975-1984

Толкин Джон Рональд Руэл
2. Химия и жизнь. Фантастика и детектив
Фантастика:
социально-философская фантастика
научная фантастика
юмористическая фантастика
детективная фантастика
5.00
рейтинг книги
«Химия и жизнь». Фантастика и детектив. 1975-1984

Воины Пустошей Хаоса (сборник)

Вернер К. Л.
Warhammer Chronicles
Фантастика:
эпическая фантастика
боевая фантастика
5.00
рейтинг книги
Воины Пустошей Хаоса (сборник)

Абсолютное оружие (сборник)

Шекли Роберт
Сборники Роберта Шекли
Фантастика:
научная фантастика
7.18
рейтинг книги
Абсолютное оружие (сборник)

Суд королевской скамьи

Юрис Леон
Проза:
историческая проза
5.00
рейтинг книги
Суд королевской скамьи