一个简易的进度条
\r与\n
回车 \r 本义是光标重新回到本行开头
换行 \n 本义是光标往下一行(不一定到下一行行首)
我们通常用的Enter是两个操作加起来实现的。
fflush(stdout)
首先,当我们使用输出函数 printf 或 cout 打印内容时,输出永远不会直接写入“屏幕”。而是被发送到 stdout。
stdout 像一个缓冲区,stdout默认是行缓冲,也就是它遇到‘\n’,才向外输出内容,如果你想stdout也实时输出内容,那就在输出语句后加上fflush(stdout),这样就能达到实时输出的效果。
通俗的讲,如果收到了一个换行符,stdout就会把这个缓冲区的内容打印到屏幕上,并清空。而 fflush 的作用就是直接把缓冲区的内容打印到屏幕上,并清空缓冲区。不必等换行符。
sleep()与usleep()
1秒 (s)= 1000毫秒(ms)
1毫秒 = 1000微秒(us)
Linux下(使用的gcc的库),sleep ()函数是以秒为单位的,sleep (1)就是休眠1秒,这对这个简易的进度条来讲确实有点慢了。
我们使用usleep()函数,其**以微秒(us)为单位,**故更合适。
进度条的实现
1 #include<stdio.h>
2 #include<string.h>
3 #include<unistd.h>
4
5 #define STYLE '*'
6 #define SIZE 101
7 void process()
8 {
9 const char* sch="|\\-//";// 【//】表示输出/,【\\】表示输出\
10 char bar[SIZE];
11 memset(bar,'\0',sizeof(bar));//先将整个进度条都初始化为'\0'
12
13
14 int cur=0;
15 while(cur<=100)
16 {//以%-100s输出表示从左边输出并且留够足够大的空间,%%表示输出一个%用来做百分比标识,变化标识符只有0123故将其模4即可
17 printf("bar[%-100s][%d%%] [%c]\r",bar,cur,sch[cur%4]);
18 fflush(stdout);
19 bar[cur++]=STYLE;//进度条覆盖标识
20 usleep(200000);
21 }
22 printf("\n");
23 }
24 int main()
25 {
26 process();
27 return 0;
28 }
效果:
当然这只是一个非常简陋的进度条,只是借此练习一下vim的一些用法以及理解make/makefile的应用。