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

xriantvc  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(183)

我想写一个游戏在Linux终端(在C/C ++),所以首先我应该能够打印字符,我想它。我尝试了"printf()",但似乎有点不方便。我认为应该有一个字符缓冲区输出字符的终端。有没有办法直接操纵缓冲区?
多谢了。

pw9qyyiw

pw9qyyiw1#

它以不同的方式运行。终端不是别的,而是字符设备,这意味着它实际上是无缓冲的。尽管如此,您仍然可以使用适当的字符序列(称为“转义序列”)来操纵屏幕位置。例如,如果您发出\e[A(0x 1B 0x 91 0x 41)序列,则光标向上移动一行,同时字符保持不变,而如果您发出\e[10;10 H,(0x 1B 0x 91 0x 31 0x 30 0x 3B 0x 31 0x 30 0x 48),则光标将转到第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;
}

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

dm7nw8vv

dm7nw8vv2#

你可能想使用setbuf函数,它允许你告诉printf使用哪个缓冲区,你可以使用你自己的缓冲区并控制内容。
然而,这是错误的方法,原因有二。
首先,与printf()、fwrite()和putchar()相比,它不会保存您的工作。
第二,更重要的是,即使这些功能也帮不了你。从你的评论中可以明显看出,你想操作屏幕上的一个字符,例如,替换一个“.”(空楼层)按D(Dragon)当那条龙接近时。你不能通过操作printf的输出缓冲区来完成这个操作()。一旦显示了“.”,输出缓冲区就已经被刷新到终端,如果你操作那个缓冲区,它就不会起作用。终端已经收到了那个缓冲区的副本,并且已经显示了缓冲区中的数据指示它显示的内容。为了改变显示的内容,你必须发送新的命令。
而这正是ncurses为你做的,它跟踪终端的状态,当前的内容,光标的位置和所有讨厌的细节,比如,如何使一个字符看起来加粗。
你不会成功使用printf,那是没有希望的,你需要学习ncurses能为你做什么,然后其他的事情就容易了。

tjjdgumg

tjjdgumg3#

TLDR:使用ncurses
此答案侧重于为什么?
为什么?
如果您有足够的权限写入相应的内存,甚至可以根据需要修改其他系统资源,那么可能有一种方法可以修改系统上终端仿真器使用的缓冲区。
作为terminals historically have been distinct, isolated, physical devices而不是beeing conceptually emulated in software,除了向它们发送数据之外,您无法以任何方式访问它们。
(我的意思是,你总是可以在本地打印一条消息,指示一个人拿着螺丝刀,在物理终端设备上摆弄一下,但这不是人类想要解决的当代问题:“我如何在我的(以及可能连接的任何其他)终端上改变光标位置并重写字符?”)
正如其他人所指出的,大多数物理终端(在某个时候)都是为了给某些输入序列给予特殊意义而构建的,而不是打印它们,这使得它们在本文中是escape sequences,这取决于www.example.com如何wikipedia.org定义它们。
出现了一种如何响应特定输入序列的行为惯例(可能是为了互操作性或市场优势)
并且被标准化为ANSI escape codes
这些输入序列在从物理终端设备转换到其仿真对应设备之后仍然存在,即使您可能可以使用系统调用来操纵终端仿真器的内存,ncurses等库也允许您在控制台应用程序中轻松地使用所述ANSI escape codes

此外,使用此类库显然是让应用程序远程工作的解决方案:

是的,从技术上讲,您可以ssh到另一个系统(或以任何其他更模糊的方式访问,为您工作),
并引起系统调用或任何其它将以期望的方式干扰终端仿真器的事件。

  • 首先,我怀疑大多数用户会仅仅为了享受您的文本冒险而授予您修改其终端模拟器内存的特权。
  • 此外,互操作性也会降低,因为你不能很容易地支持一个用户,他仍然有一个VT100,并坚持使用它来玩你的游戏。

相关问题