Oli*_*rth 8 c linux terminal pipe c89
我正在编写一个过滤器(在一个用于终端输出的管道中),有时需要"覆盖"刚刚发生的一行.它的工作原理是将stdin逐个字符传递给stdout直到\n达到a,然后调用特殊行为.我的问题是如何回到行的开头.
我想到的第一件事是使用一个\r或ANSI序列\033[1G.但是,如果该行足够长以包裹在终端上(因此导致它滚动),这些只会将光标移回当前物理行.
我的第二个想法是跟踪线的长度(自上一次以来传递的字符数\n),然后\b多次回显.但是,如果该行包含控制字符或转义序列(可能还有Unicode?),则会出错.
如果没有搜索所有特殊序列并使用它来调整我的字符数,是否有一种简单的方法可以实现这一目标?
您可以通过简单的操作查询终端尺寸ioctl:
#include <sys/types.h>
#include <sys/ioctl.h>
// ...
struct winsize ws;
ioctl(1, TIOCGWINSZ, &ws);
// ws.ws_col, ws.ws_row should now contain terminal dimensions
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以防止打印超出行尾的任何内容,只需使用该\r方法即可。
| 归档时间: |
|
| 查看次数: |
4687 次 |
| 最近记录: |