Читаем Основы программирования в Linux полностью

     *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++;

 }

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

  key = getch;

 }

 delwin(track_pad_ptr);

 keypad(stdsсr, FALSE);

 nocbreak;

 echo;

}

4. В последних двух функциях вызывается функция get_return, которая приглашает к вводу и считывает символ возврата каретки, игнорируя другие символы.

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT