在Linux上写一个小程序——进度条

一、\r 和 \n

  • \r :回车,光标回到该行的最开始。
  • \n:换行,光标来到下一行的最开始。

二、行缓冲区

//(1)
#include <stdio.h>
#include <time.h>

int main()
{
	printf("hello world!\n");
	sleep(3);
	return 0;
}
//(2)
#include <stdio.h>
#include <unistd.h>                                            

int main()
{
  printf("hello world!");
  sleep(3);
  return 0;
}

运行上述两个代码,有什么区别?

第一个代码:直接打印hello world! 三秒后程序结束。
第二个代码:三秒后打印hello world! 同时程序结束。

为什么?
因为有缓冲区这个东西,程序运行时,你printf的字符会先存在缓冲区中,等到缓冲区刷新就打印在屏幕上,而\n起到了刷新缓冲区的作用。
我们来修改一下第二段代码:

#include <stdio.h>
#include <unistd.h>                                            

int main()
{
  printf("hello world!");
  fflush(stdout);	//刷新缓冲区
  sleep(3);
  return 0;
}

这样就会先打印hello world,然后三秒后程序结束。

再来看看下面两段代码:

#include <stdio.h>    
#include <unistd.h>    
    
int main()    
{    
  printf("hello world!\r");                                            
  sleep(3);    
  return 0;    
}    
#include <stdio.h>    
#include <unistd.h>    
    
int main()    
{    
  printf("hello world!\r");                                        
  fflush(stdout);    
  sleep(3);    
  return 0;    
} 

第一段代码:什么都不显示,三秒后程序结束。
第二段代码:打印hello world,三秒后hello world消失被覆盖,程序结束。

因为\r使光标回到了行首,所以命令提示覆盖了hello world。

三、进度条

#include "proc.h"
#define SIZE 102	
#define STYLE '='
#define ARR '>'
void process()
{
  const char* label = "|/-\\";	//模拟加载圈
  char a[SIZE];
  memset(a, '\0', sizeof(a));
  int i = 0;
  while (i <= 100)
  {
    printf("[%-100s][%d%%][%c]\r", a, i, label[i % 4]);     //-100是让‘=’靠左对齐,以实现从左向右加载。                                                                                                                 
    fflush(stdout);
    a[i++] = STYLE;
    if (i != 100)
    {
      a[i] = ARR;	//模拟箭头
    }
    usleep(100000);	//单位为毫秒
  }
  printf("\n");
}

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h665_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值