我正在编写一个C++程序控制台程序下载一个大文件.我知道文件的大小,我会启动一个工作线程来下载它.我想展示一个进度指示器,让它看起来更酷.

如何在不同的时间显示不同的字符串,但是在相同的位置,在cout或printf中?

推荐答案

在输出的宽度固定的情况下,使用以下方法:

float progress = 0.0;
while (progress < 1.0) {
    int barWidth = 70;

    std::cout << "[";
    int pos = barWidth * progress;
    for (int i = 0; i < barWidth; ++i) {
        if (i < pos) std::cout << "=";
        else if (i == pos) std::cout << ">";
        else std::cout << " ";
    }
    std::cout << "] " << int(progress * 100.0) << " %\r";
    std::cout.flush();

    progress += 0.16; // for demonstration only
}
std::cout << std::endl;

http://ideone.com/Yg8NKj

[>                                                                     ] 0 %
[===========>                                                          ] 15 %
[======================>                                               ] 31 %
[=================================>                                    ] 47 %
[============================================>                         ] 63 %
[========================================================>             ] 80 %
[===================================================================>  ] 96 %

请注意,此输出是shown,每隔一行输出,但在终端仿真器中(我想也是在Windows命令行中),它将打印为on the same line.

最后,在打印更多内容之前,不要忘记打印换行符.

如果你想删除最后的条,你必须用空格覆盖它,打印一些较短的内容,比如"Done.".

当然,同样的方法也可以在C中使用printf;修改上述代码应该是直截了当的.

C++相关问答推荐

GCC:try 使用—WError或—pedantic using pragmas

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

变量>;-1如何在C中准确求值?

这是一个合法的C Strdup函数吗?

如何使用低级C++写出数值

仅在给定的大小和对齐方式下正确创建全局

如何将字符串传递给函数并返回在C中更改的相同字符串?

为什么net/if.h在ifaddrs.h之前?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

1处的解析器错误:yacc语法的语法错误

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

tick.q中的Kdb+键控表语法

我的C函数起作用了,但我不确定为什么

链接到底是如何工作的,我在这里到底做错了什么

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

OMP并行嵌套循环

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

GDB 跳过动态加载器代码

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?