如何直接操作终端输出缓冲区

时间:2014-12-22 08:43:32

标签: c++ c linux printing terminal

我想在Linux终端上编写游戏(在C / C ++中),所以首先我应该能够打印出我想要的角色。我试过“printf()”,但似乎有点不方便。我认为终端的输出字符应该有一个字符缓冲区。有没有办法直接操纵缓冲区?

非常感谢。

2 个答案:

答案 0 :(得分:3)

它以不同的方式进行。 终端不是别的,而是一个字符设备,这意味着它实际上是无缓冲的。尽管如此,您仍然可以使用适当的字符序列来操纵屏幕位置,称为"转义序列"。例如,如果发出\ e [A(0x1B 0x91 0x41)序列,光标会向上移动一行而字符保持不变,而如果发出\ e [10; 10H,(0x1B 0x91 0x31 0x30 0x3B 0x31 0x30 0x48) ),您的光标将转到第10行的第10列(正是您想要的)。移动光标后,您写出的下一个字符将转到该位置。有关转义序列的更多信息,请查看this link

另一个需要了解的重要事项是终端的尺寸。 ioctl可以告知您终端窗口的大小:

#include <stdio.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
int main ()
{
    struct winsize ws;
    ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws);
    printf ("Rows: %d, Cols: %d\n", ws.ws_row, ws.ws_col);
    return 0;
}

请注意,上述技术是将命令发送到连接到伪终端设备的终端仿真器的解决方案。也就是说,终端设备本身保持无缓冲,命令由终端仿真器解释。

答案 1 :(得分:1)

您可能希望使用setbuf函数,该函数允许您告诉printf要使用哪个缓冲区。您可以使用自己的缓冲区并控制内容。

然而,由于两个原因,这是错误的做法。

第一,与printf(),fwrite()和putchar()相比,它不会挽救你的工作。

第二,更重要的是,即使这些功能也无法帮到你。从您的评论中可以清楚地看到,您想要操纵屏幕上的角色,例如,替换“&#39;”。当龙接近时,D(龙)的(空楼)。你不能通过操作printf()的输出缓冲区来做到这一点。一旦&#39;。&#39;如果显示,则输出缓冲区已刷新到终端,如果操作该缓冲区,则无效。终端已收到该缓冲区的副本,并显示缓冲区中的数据指示它显示的内容。要更改显示的内容,您必须发送新命令。

这正是ncurses为你所做的。它跟踪终端的状态,当前内容,光标位置和所有讨厌的细节,比如,如何使角色显得粗体。

你用printf取得了成功。那是绝望的。你需要了解ncurses可以为你做什么,然后其他一切都很容易。