【Linux】写一个简单的进度条

来源:互联网 发布:网络水军如何找站 编辑:程序博客网 时间:2024/05/21 04:21

一、前言

为什么要写一个进度条呢?其实就是想通过这个来说明两个问题,一个是printf函数缓冲区的问题,一个是'\n','\r'的区别。那么我们先来弄清楚这两个问题。

二、printf缓冲区

我们知道,输出到屏幕相当于访问外设,而外设的速度和内存的速度是相差甚远的,如果每次输出都直接去访问外设,一定会造成效率的下降,所以,printf设置了三种缓冲方式。
1.全缓冲,即整个缓冲区满才会输出到外设。
2.行缓冲,即写满一行输出到外设
3.无缓冲,不用等待,实时的输出。
进度条是需要实时显示当前状态的,所以,需要无缓冲方式,而printf在不加\n或者\r的情况下是不会进行刷新的,那显示器就不会显示当前进度条的状态,根据进度条需要,加换行符也是不合理的,所以需要强制刷新。使用fflush()函数。我们在Linux下用man fflush指令查看一下这个函数:

如图,它的参数是一个文件流。这里又要提到在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,即:stdout, stdin, stderr分别是标准输出,标准输入和标准错误。这里fflush()函数的参数指的就是这三种。我们今天是要输出到屏幕,故要刷新的是stdout。

三、'\n'和'\r'的区别。

我们都知道'\n'是换行符,'\r'是回车符,很多时候会把它和键盘上的Enter键的功能混淆,其实Enter键就相当于'\n'+'\r'。\r是把光标移到行首,'\n'是把光标移到下一行。
我们的进度条每次状态改变的时候需要光标移到行首重新打印。故用到的是'\r'。

四、进度条的实现

 1 #include<stdio.h>  2 #include<unistd.h>  3 void bar()  4 {  5     char arr[102];  6     arr[0]='\0';  7     int reg=0;  8     char brr[]="-\\|/";  9     while(reg<=100) 10     { 11  12         printf("[%-100s][%c%%]",arr,brr[reg%4]); 13         printf("\r"); 14         fflush(stdout); 15         arr[reg]='='; 16         reg++; 17         arr[reg]='\0'; 18         usleep(10000); 19  20     } 21 } 22  23 int main() 24 { 25     bar(); 26     return 0; 27  28 }
解释一下这里的%-100s,%s是按字符串格式输出,-100的意思就是预留出100个空间。

结果显示:





0 0
原创粉丝点击