您的位置:首页 > 运维架构 > Linux

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

2016-06-04 22:47 316 查看
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 }



实现进度条需要熟悉下面的几个知识点
1、\r
以\r为输出控制符



运行结果:



很明显,没有输出结果。
在第一行输出后面增加一句输出




输出结果:




给第二行输出加\n



输出结果:



此时可以看到第二行将第一行输出覆盖
此时给给第一个输出加上\n



输出结果:




由以上程序可以看出,
回车换行(\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来刷新缓冲区,所以程序结束,也会刷新。

输出结果

在程序运行时因为加入了延时,输出结果并不是一个一个字符输出,而是一次输出1024个字符,从而证明行缓冲区大小为1024个字节。3、sleep,usleep
也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 行缓 冲区