赞
踩
平常是否做过一些小项目需要耗费一定的时间?看着别人的软件上的进度条着实有些羡慕,不放来实现一个简单的进度条吧!
首先,我们需要将【】左右中括号“固定”在屏幕的两边,然后依次用“=”将它填满,是从左向右的。
初步编写代码如下:
#include <stdio.h> void ProgressBar() { char arr[102] = {'\0'}; int n = 100, i = 0; while (i <= n) { arr[i] = '='; printf("[%100s]\r", arr); i++; } printf("\n"); } int main() { ProgressBar(); return 0; }
printf格式化字符串%s中间的100表示固定列宽,使【】两个中括号分别固定在屏幕两边。最后的 ‘\r’ 表示回车,每次打印完数组使光标回到屏幕左边,看看效果怎么样:
运行的太快了,直接全部跑出来了,我要让它慢慢走,改一下程序,让它小睡一会:
再来看效果:
#include <stdio.h> #include <unistd.h> void ProgressBar() { char arr[102] = {'\0'}; int n = 100, i = 0; while (i <= n) { arr[i] = '='; printf("[%100s]\r", arr); i++; usleep(100000); } printf("\n"); } int main() { ProgressBar(); return 0; }
这次到时变慢了,但是每次走的是一大段,而不是一个‘=’,这是输出缓冲区的数据没有即使刷新到显示器导致的,每次printf后fflush刷新一下输出缓冲区即可,另外有点诡异的是等号居然是从1用边往左边长的,这不是我想要的结果,仔细分析一下原因,就知道了这是 右对齐 在作怪,把它变成左对齐就好了:
效果如下:
#include <stdio.h> #include <unistd.h> void ProgressBar() { char arr[102] = {'\0'}; int n = 100, i = 0; while (i <= n) { arr[i] = '='; printf("[%-100s]\r", arr); fflush(stdout); i++; usleep(100000); } printf("\n"); } int main() { ProgressBar(); return 0; }
现在是从左往右增长了,而且每次长一个等号。只是现在空有一个进度条有点尴尬,看看别人的进度条都有百分比,加上:
看看效果如何:
#include <stdio.h> #include <unistd.h> void ProgressBar() { char arr[102] = {'\0'}; int n = 100, i = 0; while (i <= n) { arr[i] = '='; printf("[%-100s][%d%%]\r", arr, i); fflush(stdout); i++; usleep(100000); } printf("\n"); } int main() { ProgressBar(); return 0; }
还欠缺点什么。。哦,对比一下别人的实现,有时候进度条会有停止不前的时候,这个时候我们很难知道程序是在继续运行还是已经卡死了,不免让人捉急,所以弄个图标来提示一下。
我们用 | / - \ 这几个符号依次出现来达到一种动态旋转的效果,代码如下:
再看看效果:
#include <stdio.h> #include <unistd.h> void ProgressBar() { char arr[102] = {'\0'}; char *imag = "|/-\\"; int n = 100, i = 0; while (i <= n) { arr[i] = '='; printf("[%-100s][%d%%][%c]\r", arr, i, imag[i % 4]); fflush(stdout); i++; usleep(100000); } printf("\n"); } int main() { ProgressBar(); return 0; }
我的显示器上已经显示出了右边有一个动态旋转的小图标了!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。