Сравнивает номер в каталоге и копирует элемент, если не
найдено совпадение */
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. Вам также нужно иметь возможность перечислить на экране дорожки выбранного компакт-диска. Для вложенных окон можно использовать директивы