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

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

<i>  get_return();</i>

 }

}

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

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

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

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

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

 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, &quot;You must select a CD first. &quot;);

<i>  get_return();</i>

  return;

 }

<i> clear_all_screen();</i>

 cat_length = strlen(current_cat);

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

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

 if (!tracks_fp) return;

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

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

 }

 fclose(tracks_fp);

 /* Создает новую панель, гарантируя, что даже при наличии одной

    дорожки панель достаточна большая, поэтому последующий вызов

    prefresh() всегда будет допустим. */

 track_pad_ptr = newpad(tracks + 1 + ВОХЕD_LINES, BOXED_ROWS + 1);

 if (!track_pad_ptr) return;

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

 if (!tracks_fp) return;

 mvprintw(4, 0, &quot;CD Track Listing\n&quot;);

 /* Записывает сведения о дорожке на панель */

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

  /* Сравнивает номер каталога и оставшийся вывод элемента */

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

   mvwprintw(track_pad_ptr, lines_op++, 0, &quot;%s&quot;, entry + cat_length + 1);

  }

 }

 fclose(tracks_fp);

 if (lines_op &gt; BOXED_LINES) {

  mvprintw(MESSAGE_LINE, 0,

   &quot;Cursor keys to scroll, RETURN or q to exit&quot;);

 } else {

  mvprintw(MESSAGE_LINE, 0, &quot;RETURN or q to exit&quot;);

 }

 wrefresh(stdscr);

 keypad(stdscr, TRUE);

 cbreak();

 noecho();

 key = 0;

 while (key != &quot;q&quot; &amp;&amp; key != KEY_ENTER &amp;&amp; key != '\n') {

  if (key == KEY_UP) {

   if (first_line &gt; 0) first_line--;

  }

  if (key == KEY_DOWN) {

   if (first_line + BOXED_LINES + 1 &lt; tracks) first_line++;

  }

  /* Теперь рисует соответствующую часть панели на экране */

  prefresh(track_pad_ptr, first_line, 0, BOX_LINE_POS, BOX_ROW_POS,

   BOX_LINE_POS + BOXED_LINES, BOX_ROW_POS + BOXED_ROWS);

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