2

我有这个程序,它将文本文件的前 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);
4

1 回答 1

2

我怀疑您正试图在窗口范围之外打印。

特别是,我想在这里:

mvwprintw(results_scrn,num_rows_res,(num_col_res/2) - 2,"Close");

...num_rows_resresults_scrn窗口中的行数 - 但这意味着有效的行坐标范围从0num_rows_res - 1

如果您尝试移出move()wmove()移出窗口,则光标实际上不会移动;随后的printw()orwprintw()将在前一个光标位置打印。如果您尝试使用mvprintw()or 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在失败的情况下。)

于 2011-10-06T00:05:28.030 回答