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

C++ 如何直接操作终端输出缓冲区,c++,c,linux,printing,terminal,C++,C,Linux,Printing,Terminal,我想在Linux terminalIn C/C++中编写一个游戏,所以首先我应该能够打印我想要的字符。我尝试使用printf,但似乎有点不方便。我认为终端的输出字符应该有一个字符缓冲区。有没有办法直接操作缓冲区? 非常感谢。您可能需要使用该函数,该函数允许您告诉printf要使用哪个缓冲区。您可以使用自己的缓冲区并控制内容 然而,这是一种错误的方法,原因有二 首先,与printf、fwrite和putchar相比,它不会节省您的工作量 第二,更重要的是,即使这些功能也帮不了你。从您的评论中可以清

我想在Linux terminalIn C/C++中编写一个游戏,所以首先我应该能够打印我想要的字符。我尝试使用printf,但似乎有点不方便。我认为终端的输出字符应该有一个字符缓冲区。有没有办法直接操作缓冲区? 非常感谢。

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

然而,这是一种错误的方法,原因有二

首先,与printf、fwrite和putchar相比,它不会节省您的工作量

第二,更重要的是,即使这些功能也帮不了你。从您的评论中可以清楚地看出,您希望操纵屏幕上的一个角色,例如,当龙靠近时,用D龙替换“.”空地板。您不能通过操纵printf的输出缓冲区来实现这一点。显示“.”后,输出缓冲区已刷新到终端,如果操作该缓冲区,则不会产生任何效果。终端已收到该缓冲区的副本,并已显示缓冲区中的数据指示其显示的内容。要更改显示内容,必须发送新命令

这正是你所需要的。它跟踪终端的状态、当前内容、光标位置和所有令人讨厌的细节,例如,如何使字符显示为粗体


使用printf不会成功。那是没有希望的。你需要学习ncurses能为你做什么,然后其他一切都变得简单。

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

另一个需要了解的重要事项是终端的尺寸。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;
}

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

不清楚您在问什么。为什么要直接操作缓冲区?您不知道吗可能是想立即输出到屏幕上?你应该根据游戏中的需要查看ncurses以获得完整的终端控制。您好,我的意思是,我认为终端的输出必须存储在某个缓冲区中,我想知道是否有办法直接修改它。例如,假设终端窗口中的位置2、3处有一个字符“c”,然后我想将其更改为“a”。此“c”必须存储在缓冲区“buf”中的某些位置,比如“buf[2][3]”。我正在寻找一种方法,直接操纵此“buf”来修改“buf[2][3]“从‘c’到‘a’。您清楚吗?正如您前面所说,“printf”的输出缓冲区最终将刷新到终端以显示。终端接收缓冲区的副本。那么,我可以在终端中找到该缓冲区吗?它接收副本并直接操作它吗?ncurses实际上就是这样做的吗?不,您不能在终端中找到缓冲区终端。终端接收数据,将数据解释为指令,然后数据就消失了。之后,你唯一能做的就是向终端发送更多数据,发送新指令。这就是ncurses为你做的。@Trams你是什么意思?例如,终端窗口的大小不能通过ioctlSuc更改h如何更改终端中的字体和字符大小?我可以管理吗?