我有一个包含文件循环的现有程序。 它做各种事情,提供大量的terminal输出。 我希望在terminal底部的同一行上保留一个总体进度条,而文件操作的所有输出都会打印在上面。 我应该如何尝试做这样的事情?
编辑:所以,只是要清楚,我试图解决显示问题固有的东西有点像下面这样:
#include <unistd.h> #include <iostream> #include <string> using namespace std; int main(){ for (int i = 0; i <= 100; ++i){ std::cout << "processing file number " << i << "\n"; string progress = "[" + string(i, '*') + string(100-i, ' ') + "]"; cout << "\r" << progress << flush; usleep(10000); } }
移动光标的唯一便携方式就是使用\r
移动到行首。 你提到你想输出高于进度的东西。 幸运的是,您在Linux上运行得很顺利,您可以使用终端转义码自由移动终端。 看看这个例子:
#include <unistd.h> #include <iostream> #include <string> using namespace std; int main() { cout << endl; for (int i=0; i <= 100; ++i) { string progress = "[" + string(i, '*') + string(100-i, ' ') + "]"; cout << "\r\033[F" << i << "\n" << progress << flush; usleep(10000); } }
在这里,我添加了在进度条上方打印进度值的功能,在打印前使用\r
和一行使用转义代码\033[F
来移动到行的开头。 然后,打印一行,用\n
向下移动一行并重新打印进度。
打印前,您可以走得更远,将光标移动到终端中的任何X,Y位置。 为此,在输出之前使用转义码\033[Y;Xf
。
有关转义代码的详细列表,请参阅Wikipedia: https : //en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
所以,可以在不使用ncurses
类的附加库的情况下实现这个行为,但是如果你打算创建一个更类似gui的体验,那么它可能就是你想要的。
修复你的尝试:
void print_progress_bar(int percentage){ string progress = "[" + string(percentage, '*') + string(100 - percentage, ' ') + "]"; cout << progress << "\r\033[F\033[F\033[F" << flush; } int main(){ cout << endl; for (int i=0; i <= 100; ++i){ std::cout << "processing file number " << i << "\n"; std::cout << " doing thing to file number " << i << "\n"; std::cout << " doing another thing to file number " << i << "\n"; print_progress_bar(i); usleep(10000); } cout << endl; cout << endl; cout << endl; cout << endl; }