我正在编写一个过滤器(在用于终端输出的管道中),有时需要“覆盖”刚刚出现的行。它的工作原理是将 stdin 逐个字符地传递到 stdout,直到到达 \n
,然后调用特殊行为。我的问题是如何返回到行首。
我首先想到的是使用 \r
或 ANSI 序列 \033[1G
。但是,如果该行足够长以致于在终端上换行(并因此导致它滚动),这些只会将光标移回当前的物理行。
我的第二个想法是跟踪行的长度(自上一个 \n
以来传递的字符数),然后多次回显 \b
。但是,如果该行包含控制字符或转义序列(可能还有 Unicode?),那就出错了。
如果没有搜索所有特殊序列并使用它来调整我的字符数,是否有一种简单的方法可以实现这一点?
最佳答案
即使有一个“神奇的序列”,当写入控制台时可以可靠地删除最后写入的行,您仍然会在输出中得到该行和序列(尽管隐藏在控制台上)。想一想如果有人将输出写入文件,或将其通过管道传递给其他过滤器会发生什么?他们知道如何处理此类输入吗?不要告诉我你排除了在其他地方而不是直接写入控制台的可能性。迟早会有人想要重定向输出 - 甚至可能是你!
正确的做法是在处理每一行时将其缓存在内存中,然后再决定是否输出。真的没有办法解决这个问题。
关于c - 在启用换行的情况下将终端光标返回到行首,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683935/