gpt4 book ai didi

c - 如何在 C 中实现终端中的删除输出?

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:11 24 4
gpt4 key购买 nike

一些在终端中运行的应用程序可以删除它们的输出。例如当它告诉您等待时,它会显示一系列不同长度的点交替出现。

如何在 C 中实现终端中的删除输出?是反向换行吗?

程序是否可以只删除当前行中的前面字符,而不删除标准输出中上一行中的字符?

谢谢。

最佳答案

这取决于终端。

Windows 上的 COMSPEC shell(通常称为 DOS 提示符或 command.com)在 C 中公开了一个 API 来控制光标。我没有做过任何 Windows 编程,所以我不能告诉你太多。

大多数其他终端(尤其是在 unixen 上)模拟类似于 VT100 串行终端的协议(protocol)(VT100 终端是一个物理设备,一个监视器和键盘,您连接到调制解调器或串行端口以与服务器通信)。

在 VT100 终端上,回车和换行是单独的命令,都是一个字节。回车命令将光标设置到行首。换行命令将光标向下移动一行(但不会自行将光标带到行的开头)。 unixen 上的大多数 shell 会在换行后自动插入回车,但几乎没有一个会在回车后插入换行。

有了这些知识,最简单的实现就是简单地输出回车并重新打印整行:

printf("\rprogress: %d percent  ", x);

注意行末的额外空格。打印 "\r" 不会删除该行,因此在旧行上重新打印可能最终会在屏幕上留下一些旧字符串。额外的空格用于尝试删除旧行的其余部分。

如果你用谷歌搜索 "VT100 escape secquence" ,您会发现允许您执行诸如删除当前行、更改文本颜色、转到屏幕上特定行/列等操作的命令。VT100 序列最流行的用途是输出彩色文本。但您也可以用它们做其他事情。

下一个最简单的实现是彻底删除该行并重新打印它:

printf("\033[2K\rprogress: %d percent", x);

\033[2K是删除当前行的转义序列(ESC[2K)。

如果您愿意,您可以从这里获得更多创意。您可以将光标保存/恢复命令与删除直到行尾命令一起使用,以仅删除要更新的部分(而不是整行)。您可以使用 goto 命令将光标放在屏幕上的特定位置以更新那里的文本等。

应该注意的是,更高级的东西,如 VT102 序列或一些完整的 ANSI 转义序列通常不能跨终端移植(我所说的终端不是指 shell,我指的是终端:rxvt、xterm、 linux 终端、 super 终端(在 windows 上)等)。

如果您想要可移植性(和/或健全的 API),您应该使用 curses 或 ncurses 库。

如果您想知道它是如何完成的,那就是它是如何完成的。它只是将特殊格式的字符串打印到屏幕上(COMSPEC 外壳除外)。有点像 HTML,但很老派。

关于c - 如何在 C 中实现终端中的删除输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com