我正在编写一个任务监控,它使用cout更新任务的进度.我想在每行显示一个任务进度,因此我必须回滚几行控制台.
我坚持"几个"因为\b一行的工作,但不删除\n行之间.
我试过std::cout.seekp(std::cout.tellp() - str.length());但tellp()返回-1(失败).
pts*_*pts 20
您可以cout << '\r';跳转到当前行的开头,但向上移动是特定于系统的.对于Unix,请参阅man termcap和man terminfo(并搜索cursor_up).在ANSI兼容的终端(例如Unix上可用的大多数现代终端)上,这可以向上移动:cout << "\e[A";.
不要尝试进入cout,大多数时候都无法搜索(除非重定向到文件).
正如其他答案中所提到的,使用ncurses(或slang)库为Unix上的终端I/O提供了一个很好的抽象.
而不是填充空格(这是容易出错的,因为不是每个终端都是80个字符宽),你可以做\r+ clr_eol: std::cout << "\r\e[K" << std::flush.