курсор не будет перемещаться при использовании move () или wmove() при использовании библиотеки curses

#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 в случаях, когда происходит сбой.)