我正在编写一个任务监控程序,它使用 cout 更新任务的进度。我想每行显示一个任务进度,因此我必须回滚控制台的几行。
我坚持使用“多个”,因为 \b
完成一行的工作,但不会删除行与行之间的 \n
。
我尝试了 std::cout.seekp(std::cout.tellp() - str.length());
但 tellp()
返回 -1 (失败)。
最佳答案
你可以做到 cout << '\r';
跳转到当前行的开头,但向上移动是系统特定的。对于 Unix,请参阅 man termcap
和 man terminfo
(并搜索 cursor_up
)。在 ANSI 兼容终端(例如 Unix 上可用的大多数现代终端)上,这可以向上移动:cout << "\e[A";
.
不要尝试在 cout
中寻找,它在大多数情况下是不可搜索的(重定向到文件时除外)。
如其他答案中所述,使用 ncurses(或 slang)库为 Unix 上的终端 I/O 提供了良好的抽象。
你可以用 \r
代替填充空格(这很容易出错,因为不是每个终端都是 80 个字符宽的) + clr_eol
: std::cout << "\r\e[K" << std::flush
.
关于c++ - 如何从 cout 回滚行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277058/