Основы программирования в Linux
Часть 111 из 324 Информация о книге
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препятствует этому.fgets3. Вам также нужно иметь возможность перечислить на экране дорожки выбранного компакт-диска. Для вложенных окон можно использовать директивы
, применявшиеся в функции#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, "You must select a CD first. ");<i> get_return();</i>return;}<i> clear_all_screen();</i>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++;}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, "r");if (!tracks_fp) return;mvprintw(4, 0, "CD Track Listing\n");/* Записывает сведения о дорожке на панель */while (fgets(entry, MAX_ENTRY, tracks_fp)) {/* Сравнивает номер каталога и оставшийся вывод элемента */if (strncmp(current_cat, entry, cat_length) == 0) {mvwprintw(track_pad_ptr, lines_op++, 0, "%s", entry + cat_length + 1);}}fclose(tracks_fp);if (lines_op > BOXED_LINES) {mvprintw(MESSAGE_LINE, 0,"Cursor keys to scroll, RETURN or q to exit");} else {mvprintw(MESSAGE_LINE, 0, "RETURN or q to exit");}wrefresh(stdscr);keypad(stdscr, TRUE);cbreak();noecho();key = 0;while (key != "q" && key != KEY_ENTER && key != '\n') {if (key == KEY_UP) {if (first_line > 0) first_line--;}if (key == KEY_DOWN) {if (first_line + BOXED_LINES + 1 < 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);