Литмир - Электронная Библиотека
Содержание  
A
A

  }

 } while (*track_name);

 delwin(sub_window_ptr);

 fclose(tracks_fp);

}

Удаление записей

1.

remove_cd
— последняя функция, вызываемая из функции
main
.

<i>void remove_cd() {</i>

 FILE *titles_fp, *temp_fp;

 char entry[MAX_ENTRY];

 int cat_length;

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

<i> clear_all_screen();</i>

 mvprintw(PROMPT_LINE, 0, &quot;About to remove CD %s: %s. &quot;, current_cat, current_cd);

<i> if (!get_confirm())</i>

  return;

 cat_length = strlen(current_cat);

 /* Файл заголовков копируется во временный, игнорируя данный CD */

 titles_fp = fopen(title_file, &quot;r&quot;);

 temp_fp = fopen(temp_flie, &quot;w&quot;);

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

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

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

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

   fputs(entry, temp_fp);

 }

 fclose(titles_fp);

 fclose(temp_fp);

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

 unlink(title_file);

 rename(temp_file, title_file);

 /* Теперь делает то же самое для файла дорожек */

 remove_tracks();

 /* Устанавливает 'None' для текущего CD */

 current_cd[0] = '\0';

}

2. Теперь вам только нужен программный код функции

remove_tracks
, удаляющей дорожки текущего компакт-диска. Она вызывается двумя функциями —
update_cd
и
remove_cd
.

<i>void remove_tracks() {</i>

 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, &quot;r&quot;);

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

 temp_fp = fopen(temp_file, &quot;w&quot;);

 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);

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

 unlink(tracks_file);

 rename(temp_file, tracks_file);

}

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

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

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

<i>void count_cds() {</i>

 FILE *titles_fp, *tracks_fp;

 char entry[MAX_ENTRY];

 int titles = 0;

 int tracks = 0;

 titles_fp = fopen(title_file, &quot;r&quot;);

 if (titles_fp) {

  while (fgets(entry, MAX_ENTRY, titles_fp))

   titles++;

  fclose(titles_fp);

 }

 tracks_fp = fopen(tracks_file, &quot;r&quot;);

 if (tracks_fp) {

  while (fgets(entry, MAX_ENTRY, tracks_fp))

   tracks++;

  fclose(tracks_fp);

 }

 mvprintw(ERROR_LINE, 0,

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

 get_return();

}

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

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

<i>void find_cd() {</i>

 char match[MAX_STRING], entry[MAX_ENTRY];

 FILE *titles_fp;

 int count = 0;

 char *found, *title, *catalog;

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

<i> get_string(match);</i>

 titles_fp = fopen(title_file, &quot;r&quot;);

110
{"b":"285844","o":1}