微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在函数内部的同一行上打印,避免刷新

如何解决如何在函数内部的同一行上打印,避免刷新

我想显示一个进度条,但是将打印代码放在一个单独的函数中似乎会调用 std::flush,因为每次进度条在新行中打印时。内联使用代码时没有发生这种情况 代码

#include <iostream>
#include <unistd.h>

void load(int curr,int total) {
    std::cout << "\n[";
    int pos = 50 * curr/total;
    for (int i = 0; i < 50; ++i) {
        if (i < pos) std::cout << "=";
        else if (i == pos) std::cout << ">";
        else std::cout << " ";
    }
    std::cout << "]" << int(float(curr)/(float)total * 100.0) << " %\r";
    std::cout.flush();
}

int main(){
    
    for( int i = 0; i <= 5; i++ ){
        load(i,5);
    }
    std::cout << std::endl;

    return 0;
}

它的作用:

[>                                                 ]0 %
[==========>                                       ]20 %
[====================>                             ]40 %
[==============================>                   ]60 %
[========================================>         ]80 %
[==================================================]100 %

它应该做什么:在同一行打印所有内容

解决方法

函数中的第一行输出 \n,这使得它每次迭代都在新行上打印。

修复:

#include <iostream>

void load(int curr,int total) {
    std::cout << '[';

    int pos = 50 * curr/total;

    for (int i = 0; i < 50; ++i) {
        if (i < pos) std::cout << '=';
        else if (i == pos) std::cout << '>';
        else std::cout << ' ';
    }
    std::cout << ']' << int(float(curr)/(float)total * 100.0) << " %\r" << std::flush;
}

int main(){

    for( int i = 0; i <= 5; i++ ){
        load(i,5);
    }
    std::cout << '\n';
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。