Как использовать функцию перемещения под curses.h - PullRequest
0 голосов
/ 05 июля 2018

Не печатается в координатах y = 10, x = 20.

#include <stdio.h>
#include <curses.h>

int main()
{
    initscr();
    refresh();
    WINDOW *win;
    wmove(win, 10, 20);
    refresh();
    printf("hi\n"); 
    return 0;
}

Когда я выполняю это так ...

./a.out > op_file

Вот что такое op_file

[?1049h[1;24r(B[m[4l[?7h[H[2J-1
hi

Может кто-нибудь объяснить ... ??

Ответы [ 4 ]

0 голосов
/ 12 июля 2018

Это работает.

#include <stdio.h>
#include <curses.h>

int main()
{
    initscr();
    refresh();

    WINDOW *win;
    win = stdscr;

    wmove(win, 10, 10);

    refresh();
    printf("hi\n");

    return 0;
}

Благодаря @ interjay.

0 голосов
/ 05 июля 2018

Чтобы переместить курсор на новую позицию в окне, используйте функцию int wmove (WINDOW * win, int y, int x)

wmove (победа, у, х); где (x, y) - координаты новой позиции в окне. Если в окне есть строки nlines и столбцы ncolumns, то

  0 <= y < nlines
  0 <= x < ncolumns

Refresh. Фактическое движение курсора не отображается на экране, пока вы не сделаете обновление (выигрыш).

move (y, x) эквивалентно wmove (stdscr, y, x) .`

Функции move () и wmove () перемещают курсор, связанный с текущим или указанным окном, в (y, x) относительно его источника. Эта функция не перемещает курсор терминала до следующей операции обновления.

Чтобы переместить логический курсор в пользовательском окне my_window к координатам y = 5, x = 10, используйте:

#include <stdio.h>
#include <curses.h>

    int main(){
        refresh();//First refresh
        WINDOW *my_window;
        int a = wmove(my_window, 5, 10);
        refresh();////Second refresh
        printf("%d\n",a);
        printf("hi\n");
        return 0;
    }
0 голосов
/ 12 июля 2018

Выход

[?1049h[1;24r(B[m[4l[?7h[H[2J-1
hi

показывает печатаемые написанные символы. Если вы посмотрите на полный текст, например, в текстовом редакторе, перед символами [ и ( появятся символы ASCII escape символы, так как это часть escape-последовательности.

Ваш пример не показывает движение курсора (кроме позиции home , которую вы видите как ^[[H ближе к концу), потому что есть нет никакой причины для библиотеки curses фактически перемещать курсор. Если бы вы попросили его прочитать символ, например, используя getch, ему пришлось бы остановиться и решить, где должен находиться курсор & mdash; и ваш wmove сделает это & ​​mdash; за исключением того, что win не инициализируется. Самое простое, что нужно сделать, это использовать stdscr (который инициализируется initscr).

Программа завершает вызовы curses без выполнения endwin (что оставляет терминал в режиме raw ). Данные выводятся на экран при вызове refresh. Данные, записанные с помощью printf, оказываются в правильном порядке, но это только случайно, так как они не используют ту же буферизацию вывода, что и ncurses.

Оба других ответа содержат похожие ошибки.

0 голосов
/ 05 июля 2018

Вы должны использовать функцию initscr() для инициализации экрана и endwin() в конце, чтобы закрыть окно ...

Если вы move(), вы должны использовать refresh(), иначе курсор не будет двигаться физически.

...