九月 28th, 2010 @ 11:10 上午 

今天想做一个进度条来的,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;更好。。。。

作者: Sunny
原创文章: 转载请注明出自 Sunny Way.
最后编辑: 九月 28th, 2010 @ 11:10 上午
Email永久链接
Tags


 

这篇日志的回复 » (没有回复)

 
发表回复

提示: 您可以使用以下标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags
Comment Meta:
回复RSS
引用URI


 最近 50 篇日志
 后退
切换主题...
  • 访问 » 8663
  • 日志 » 59
  • 回复 » 77
切换主题...
  • VoidVoid
  • LifeLife
  • EarthEarth
  • WindWind « Default
  • WaterWater
  • FireFire
  • LightLight

留言板



    No Child Pages.