如何为stdout设置控制台光标位置

时间:2014-07-23 07:06:50

标签: c++ c animation console-application ncurses

我想设置光标位置以在控制台屏幕上打印char。有没有使用ncurses库的解决方案。

下面的example是否在Linux中对SetConsoleCursorPosition进行了等效调用:

void print (int x, int y, char c) {
    COORD p = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
    printf("%c", c);
}

1 个答案:

答案 0 :(得分:7)

也许有点历史。你在Windows中称之为“控制台”的确是一个终端模拟器的例子;但是,与传统的终端仿真器不同,Windows通过其Console API提供对终端的直接访问。终端(以及终端仿真器)采用的传统方法是解释转义序列,每个转发序列指示终端执行某些操作。

不幸的是,正如您可能想象的那样,终端'功能变化很大(有些甚至可以绘制一种或另一种图形),因此并非所有终端都使用相同的转义序列集。这些天你遇到一些没有实现ANSI/VT100 escapes超集的东西是非常不幸的。如果您乐意只支持ANSI / VT100及衍生产品,您可以发送ESC [ n ; m H,其中 n 是行号, m 是列号

但是,如果您这样做,那么如果代码出现异国情况,您的代码将无法运行。在这种情况下,你真的应该考虑使用curses库(ncurses是一个常见但不是唯一的例子),即使你只是用它来从terminfo数据库中提取信息(尽管我强烈推荐)只使用curses库。)

最后,请注意:您引用Windows的代码一定不会起作用(!)为什么?因为printf()确实缓冲了输出,并且无法保证在再次更改光标位置之前将字符发送到控制台。您可以使用fflush(stdout)解决此问题,但老实说,如果您正在使用SetConsoleCursorPosition,您也可以使用WriteConsole并完成它。

其他有用信息

您实际上可以获得在Windows上运行的curses版本;见例如PDCurses。如果您使用curses,那么您也不需要任何特定于Windows的代码,您可以使用任何正在使用的终端。