c - 在启用换行的情况下将终端光标返回到行首

标签 c linux terminal pipe c89

我正在编写一个过滤器(在用于终端输出的管道中),有时需要“覆盖”刚刚出现的行。它的工作原理是将 stdin 逐个字符地传递到 stdout,直到到达 \n,然后调用特殊行为。我的问题是如何返回到行首。

我首先想到的是使用 \r 或 ANSI 序列 \033[1G。但是,如果该行足够长以致于在终端上换行(并因此导致它滚动),这些只会将光标移回当前的物理行。

我的第二个想法是跟踪行的长度(自上一个 \n 以来传递的字符数),然后多次回显 \b。但是,如果该行包含控制字符或转义序列(可能还有 Unicode?),那就出错了。

如果没有搜索所有特殊序列并使用它来调整我的字符数,是否有一种简单的方法可以实现这一点?

最佳答案

即使有一个“神奇的序列”,当写入控制台时可以可靠地删除最后写入的行,您仍然会在输出中得到该行和序列(尽管隐藏在控制台上)。想一想如果有人将输出写入文件,或将其通过管道传递给其他过滤器会发生什么?他们知道如何处理此类输入吗?不要告诉我你排除了在其他地方而不是直接写入控制台的可能性。迟早会有人想要重定向输出 - 甚至可能是你!

正确的做法是在处理每一行时将其缓存在内存中,然后再决定是否输出。真的没有办法解决这个问题。

关于c - 在启用换行的情况下将终端光标返回到行首,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683935/

相关文章:

c++ - C 中 std::pair 的等价物

c - 在for循环中填充二维数组

c++ - 使用 QT 在 Linux/Ubuntu 上读取电池状态

python - 在接口(interface)启动时,可以扫描特定的 MAC 地址吗?

c - fseek 的性能开销是多少?

string - 终端查找命令 : Manipulate Output String

c - "asm Macro"是标准 C 的一部分吗?

将 GNU case 范围扩展转换为标准 C

macos - 找不到用于全局 npm 安装的终端 (zsh) 命令

linux - "|"在终端命令行中意味着什么?