Основы программирования в Linux
}} 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, "About to remove CD %s: %s. ", current_cat, current_cd);<i> if (!get_confirm())</i>return;cat_length = strlen(current_cat);/* Файл заголовков копируется во временный, игнорируя данный CD */titles_fp = fopen(title_file, "r");temp_fp = fopen(temp_flie, "w");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, "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);/* Удаляет файл дорожек<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, "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<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, "Enter a string to search for in CD titles: ");<i> get_string(match);</i>titles_fp = fopen(title_file, "r");