Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 107 108 109 110 111 112 113 114 115 ... 324

 if (titles_fp) {

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

   /* Пропускает прежний номер в каталоге */

   catalog = entry;

   if (found == strstr(catalog, ", ")) {

    *found = '';

    title = found + 1;

    /* Стирает следующую запятую в элементе, укорачивая его

       только до заголовка */

    if (found == strstr(title, ", ")) {

     *found = '';

     /* Теперь проверяет, есть ли совпадающая строка */

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

<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] == '') {

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

1 ... 107 108 109 110 111 112 113 114 115 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий