Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

 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 {

 FILE *tracks_fp;

 char entry[MAX_ENTRY];

 int cat_length;

 int lines_op = 0;

 WINDOW *track_pad_ptr;

 int tracks = 0;

 int key;

 int first_line = 0;

 if (current_cd[0] == '\0') {

mvprintw(ERROR_LINE, 0, "You must select a CD first. ");

get_return;

return;

 }

 clear_all_screen;

 cat_length = strlen(current_cat);

 /* Сначала считает количество дорожек у текущего CD */

 tracks_fp = fopen(tracks_file, "r");

 if (!tracks_fp) return;

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

if (strncmp(current_cat, entry, cat_length) == 0) tracks++;

  • Читать дальше
  • 1
  • ...
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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