#c #unix #cursor #curses
#c #unix #курсор #проклятия #c
Вопрос:
У меня есть эта программа, которая печатает первые 5 или более строк текстового файла в окне curses, а затем печатает некоторые персонализированные входные данные. но после печати строк из текстового файла курсор не будет перемещаться при использовании move или wmove. Я напечатал слово после использования обоих и refresh(), но оно печатается в последней позиции, в которой находился курсор. Я пробовал mvprintw и mvwprintw, но таким образом я вообще не получил никакого результата. это часть кода
while (! feof(results_file))
{
fgets(line,2048,results_file);
printw("%s",line);
}
fclose(results_file);
mvwprintw(results_scrn,num_rows_res,(num_col_res/2) - 2,"Close");
wrefresh(results_scrn);
Ответ №1:
Я подозреваю, что вы пытаетесь печатать за пределами окна.
В частности, я бы предположил, что здесь:
mvwprintw(results_scrn,num_rows_res,(num_col_res/2) - 2,"Close");
… num_rows_res
— количество строк в results_scrn
окне, но это означает, что допустимые координаты строк варьируются от 0
до num_rows_res - 1
.
Если вы попытаетесь move()
переместить или wmove()
за пределы окна, курсор фактически не переместится; последующее printw()
или wprintw()
будет напечатано в предыдущей позиции курсора. Если вы попытаетесь mvprintw()
или mvwprintw()
, весь вызов завершится неудачно в момент попытки переместить курсор, и поэтому он вообще ничего не напечатает.
Вот полная демонстрация (просто печать, в stdscr
которой есть LINES
строки и COLS
столбцы):
#include <stdio.h>
#include <curses.h>
int main(void)
{
int ch;
initscr();
noecho();
cbreak();
/* This succeeds: */
mvprintw(1, 1, ">>>");
/* This tries to move outside the window, and fails before printing: */
mvprintw(LINES, COLS / 2, "doesn't print at all");
/* This tries to move outside the window, and fails: */
move(LINES, COLS / 2);
/* This prints at the cursor (which hasn't successfully moved yet): */
printw("prints at current cursor");
/* This is inside the window, and works: */
mvprintw(LINES - 1, COLS / 2, "prints at bottom of screen");
refresh();
ch = getch();
endwin();
return 0;
}
(На самом деле функции действительно возвращают результат; если вы проверите это, вы обнаружите, что это происходит ERR
в случаях, когда происходит сбой.)