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

本文讲解了进度条的实现原理,包括printf函数的缓冲机制及' '和' '的区别,并提供了一个简单的进度条实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

为什么要写一个进度条呢?其实就是想通过这个来说明两个问题,一个是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个空间。

结果显示:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值