通过实现Linux下的进度条引发的一系列问题

 Linux下实现进度条

代码如下:

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 void Progess()
  4 {
  5         char arr[101];
  6         memset(arr,'\0',sizeof(arr)/sizeof(char));
  7         char state[5]="|/-|\0";
  8         int i=0;
  9         for(i=0;i<100;++i)
 10         {
 11                 arr[i]='*';
 12                 printf("[%-100s][%d%%][%c]\r",arr,1+i,state[i%4]);
 13 
 14                 usleep(100000);//us
 15                 fflush(stdout);
 16         }
 17         printf("\n");
 18 
 19 }
 20 int main()
 21 {
 22         Progess();
 23         return 0;
 24 }

wKioL1dSzk_hYyexAAAb_KwjEjQ560.png-wh_50

实现进度条需要熟悉下面的几个知识点

1、\r

以\r为输出控制符

wKiom1dS2VmhEtMNAAAjVgwzKiY241.png-wh_50

运行结果:
wKioL1dS2omBDVRTAAAP6w21rZY010.png-wh_50

很明显,没有输出结果。

在第一行输出后面增加一句输出

wKiom1dS20OzoL8PAAAoB_tV4hM726.png-wh_50

输出结果:

wKioL1dS3YuxJO77AAARyrGiNw4275.png-wh_50

给第二行输出加\n

wKiom1dS3W2wJNbwAAAkxYk9EwE408.png-wh_50

输出结果:

wKioL1dS3pHC8IbYAAASht9xXAM400.png-wh_50

此时可以看到第二行将第一行输出覆盖

此时给给第一个输出加上\n

wKioL1dS3zXjUVHDAAAkYu_joKM921.png-wh_50

输出结果:

wKioL1dS30mCs2bmAAARYPRjHEk418.png-wh_50

由以上程序可以看出,

回车换行(\n):每次光标移到下一行的行首位置处;

换行(\r):每次光标移到本行的行首位置处

在输入\r,光标将移动到行首,输入\n光标换行并且移动到下一行行首,相当于\n\r。所以我们在程序中加入了一句fflush(stdout)来保证程序可以输出效果,未加fflush(stdout)时,程序依然能输出结果,但是结果显示是在缓冲区满时才刷新一次。

2、行缓冲区、fflush

 printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

    1 缓冲区填满

    2 写入的字符中有‘\n’ '\r'

    3 调用fflush手动刷新缓冲区

    4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

  满足上面4个条件之一缓冲区就会刷新,,也就是printf会真正调用write来写入

   当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。

wKiom1dS1ILAfEGVAAAl6FWu1xQ025.png-wh_50

输出结果

wKioL1dS1duyRUp6AAAq-HJtdew392.png-wh_50

在程序运行时因为加入了延时,输出结果并不是一个一个字符输出,而是一次输出1024个字符,从而证明行缓冲区大小为1024个字节。

3、sleep,usleep

也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。



本文出自 “qin-wang” 博客,请务必保留此出处http://10810196.blog.51cto.com/10800196/1786171

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值