std::flush和C++文本动画

CLI应用为了美观有时会加上动画,相信所有用户都希望看到流畅的动画吧?可是,诶呦喂,我的动画怎么在windows下可以流畅显示,在类unix下怎么就非常卡顿呢。。。

也许是基于性能考虑,stdout输出带有缓冲区,输出的文本不会立即显示在终端,而是等一定程度以后一股脑给输出出来。\n虽然可以让程序立即输出,但是在进度条等类似动画里会让动画实现较为麻烦;等待输出流关闭更不用想;而std::flush这个操纵符,可以立即将缓冲区内的文本输出出来,解决不连贯的问题。

我们以以下代码为例子:

#include<bits/stdc++.h>
#include<unistd.h>
using namespace std;
void process(int num,int len){
    int t=(num+1)*100/(len*6);
    for(int i=0;i<len+6;i++){
        cout<<"\b";
    }
    string point[6]={" ", "▏", "▎", "▍", "▊", "█"};
    for(int i=0;i<num/6;i++){
        cout<<point[5];
    }
    cout<<point[num-(num/6)*6];
    for(int i=0;i<len-(num/6)-1;i++){
        cout<<" ";
    }
    cout<<"] ";
    cout<<t<<"%";
    if(t<10){cout<<"  ";}
    else if(t<100){cout<<" ";}
}
void processbar(int len,int speed){
    cout<<"[";
    for(int i=0;i<len;i++){
        cout<<" ";
    }
    cout<<"] 0%  ";
    for(int i=0;i<len*6;i++){
        process(i,len);
        //cout<<flush;//TODO
        usleep(speed*1000);
    }
}
int main(){
    processbar(20,100);
    cout<<endl;
    return 0;
}

去掉cout<<flush;注释前:

去掉注释后:

差别非常明显,加上这行代码以后动画流畅许多。

标签: Linux, C++

许可协议

本文作者 , 采用 CC-BY-SA-4.0 许可协议,转载请注明出处。

添加新评论