Основы программирования в Linux
Часть 109 из 324 Информация о книге
<i>void get_string(char* string) {</i>int len;wgetnstr(stdscr, string, MAX_STRING);len = strlen(string);if (len > 0 && string[len - 1] == '\n') string[len - 1] = '\0';}3. Функция
запрашивает и считывает пользовательское подтверждение. Она читает введенную пользователем строку и проверяет, первый символ —get_confirmилиY. Если она обнаруживает другой символ, то не дает подтверждения.у<i>int get_confirm() {</i>int confirmed = 0;char first_char;mvprintw(Q_LINE, 5, "Are you sure? ");clrtoeol();refresh();cbreak();first_char = getch();if (first_char == 'Y' || first_char == 'y') {confirmed = 1;}nocbreak();if (!confirmed) {mvprintw(Q_LINE, 1, " Cancelled");clrtoeol();refresh();sleep(1);}return confirmed;}4. Последней рассмотрим функцию
. Она вставляет в базу данных компакт-дисков заголовок, добавляя строку с заголовком в конец файла заголовков:insert_title<i>void insert_title(char* cdtitle) {</i>FILE *fp = fopen(title_file, "a");if (!fp) {mvprintw(ERROR_LINE, 0, "cannot open CD titles database");} else {fprintf(fp, "%s\n", cdtitle);fclose(fp);}}Обновление записей1. Продолжим рассмотрение других управляющих функций, вызываемых из функции
. Следующая из них — функцияmain. Эта функция использует обведенное рамкой вложенное окно с прокруткой и нуждается в нескольких константах, которые объявляются как глобальные, поскольку они позже потребуются функцииupdate_cd.list_tracks<i>#define BOXED_LINES 11</i><i>#define BOXED_ROWS 60</i><i>#define BOX_LINE_POS 8</i><i>#define BOX_ROW_POS 2</i>2. Функция
позволяет пользователю заново ввести сведения о дорожках текущего компакт-диска. Удалив предыдущие записи о дорожках, она приглашает ввести новую информацию.update_cd<i>void update_cd() {</i>FILE *tracks_fp;char track_name[MAX_STRING];int len;int track = 1;int screen_line = 1;WINDOW *box_window_ptr;WINDOW *sub_window_ptr;<i> clear_all_screen();</i>mvprintw(PROMPT_LINE, 0, "Re-entering tracks for CD. ");<i> if (!get_confirm())</i>
return;move(PROMP_TLINE, 0);clrtoeol();<i> remove_tracks();</i>mvprintw(MESSAGE_LINE, 0, "Enter a blank line to finish");tracks_fp = fopen(tracks_file, "a");ПримечаниеЛистинг будет продолжен через минуту; мы хотим сделать краткую паузу, чтобы обратить ваше внимание на ввод данных в обрамленное окно с прокруткой. Хитрость заключается в формировании вложенного окна, рисовании рамки по его краю и создании внутри этого окна нового вложенного окна с прокруткой.
box_window_ptr = subwin(stdscr, BOXED_LINES + 2, BOXED_ROWS + 2,BOX_LINE_POS - 1, BOX_ROW_POS - 1);if (!box_window_ptr) return;box(box_window_ptr, ACS_VLINE, ACS_HLINE);sub_window_ptr = subwin(stdscr, BOXED_LINES, BOXED_ROWS,BOX_LINE_POS, BOX_ROW_POS);if (!sub_window_ptr) return;scrollok(sub_window_ptr, TRUE);werase(sub_window_ptr);touchwin(stdscr);do {mvwprintw(sub_window_ptr, screen_line++, BOX_ROW_POS + 2,"Track %d: ", track);clrtoeol();refresh();wgetnstr(sub_window_ptr, track_name, MAX_STRING);len = strlen(track_name);if (len > 0 && track_name[len - 1] = '\n')track_name[len - 1] = '\0';if (*track_name)fprintf(tracks_fp, "%s, %d, %s\n", current_cat, track, track_name);track++;if (screen_line > BOXED__LINES - 1) {/* время начать прокрутку */scroll(sub_window_ptr);screen_line--;