今天想做一个进度条来的,Linux系统C++程序shell版的。
1 2 3 | [======================================================] 0% [###############=======================================]30% [######################################################]100% |
计划是让他们在同一位置刷新。
实现的原理先输出进度为0的进度条,之后随着程序的进行,即时输出等长度’\b’(擦除原进度条),然后再cout进度条
1 2 3 4 5 6 7 8 9 10 | #初始 cout<<"[======================================================] 0%"; while(sth) { #刷新 cout<<"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";(长度应和想去掉的字符长度相同) #计算从新输出 cout<<$%^&*($&^…… } |
一开始测试还可以,进度条还能动,但后来进行大数据量计算的时候出现了问题,进度条不显示。在调试的过程中在行尾加入了endl,结果是换行输出,但是再cout<<"\b"的时候就退不到上一行了。
后来想起之前看C++ Primer时写的读书笔记。其中对endl的功能进行了记录,并且分析了输出缓冲区的机制,用cerr尝试了一下,不需要endl也可以即时输出,但是新的问题产生了,cerr后的数据不能退格。。(cerr<<"\b")
我就不信没有一种方法可以刷新缓冲区而不换行(endl的功能就是输出了缓冲区后换行),换了几个关键词后最终搜到了flush,它就是刷新缓冲区而不换行的方法。
通常来说基本的cout<<"something";或者cout<<"something"<<endl;就可以满足正常的需求了,但有些情况cout<<"something"<<flush;比cout<<"something"<<endl;更好。。。。


后退
Void
Life
Earth
Wind « Default
Water
Fire
Light 