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

<i>void get_string(char* string) {</i>

 int len;

 wgetnstr(stdscr, string, MAX_STRING);

 len = strlen(string);

 if (len &gt; 0 &amp;&amp; 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, &quot;Are you sure? &quot;);

 clrtoeol();

 refresh();

 cbreak();

 first_char = getch();

 if (first_char == 'Y' || first_char == 'y') {

  confirmed = 1;

 }

 nocbreak();

 if (!confirmed) {

  mvprintw(Q_LINE, 1, &quot; Cancelled&quot;);

  clrtoeol();

  refresh();

  sleep(1);

 }

 return confirmed;

}

4. Последней рассмотрим функцию

insert_title
. Она вставляет в базу данных компакт-дисков заголовок, добавляя строку с заголовком в конец файла заголовков:

<i>void insert_title(char* cdtitle) {</i>

 FILE *fp = fopen(title_file, &quot;a&quot;);

 if (!fp) {

  mvprintw(ERROR_LINE, 0, &quot;cannot open CD titles database&quot;);

 } else {

  fprintf(fp, &quot;%s\n&quot;, 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, &quot;Re-entering tracks for CD. &quot;);

<i> if (!get_confirm())</i>

return;

 move(PROMP_TLINE, 0);

 clrtoeol();

<i> remove_tracks();</i>

 mvprintw(MESSAGE_LINE, 0, &quot;Enter a blank line to finish&quot;);

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

Примечание

Листинг будет продолжен через минуту; мы хотим сделать краткую паузу, чтобы обратить ваше внимание на ввод данных в обрамленное окно с прокруткой. Хитрость заключается в формировании вложенного окна, рисовании рамки по его краю и создании внутри этого окна нового вложенного окна с прокруткой.

 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,

   &quot;Track %d: &quot;, track);

  clrtoeol();

  refresh();

  wgetnstr(sub_window_ptr, track_name, MAX_STRING);

  len = strlen(track_name);

  if (len &gt; 0 &amp;&amp; track_name[len - 1] = '\n')

   track_name[len - 1] = '\0';

  if (*track_name)

   fprintf(tracks_fp, &quot;%s, %d, %s\n&quot;, current_cat, track, track_name);

  track++;

  if (screen_line &gt; BOXED__LINES - 1) {

   /* время начать прокрутку */

   scroll(sub_window_ptr);

   screen_line--;

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