【Linux】2.4 第一个小程序——进度条(C语言)

character

在这里插入图片描述

  • 回车 与 换行

键盘上的 Enter 键:
在这里插入图片描述

换行的过程:
在这里插入图片描述

\r:回车
\n:换行+回车

缓冲区的问题:

  • 〖文件 test1.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Hello RoundBottle!\n");
  sleep(1);
  return 0;
}

test1.c 编译后的执行结果:
在这里插入图片描述
上述代码分析:\n换行符被执行后 缓冲区被刷新 ,显示器上打印——Hello RoundBottle!\n,然后执行 sleep 函数,延时一秒后,显示器上从光标所在位置打印操作提示符。

ps. sleep 函数

头文件:#include <unistd.h>
在这里插入图片描述

  • 〖文件 test2.c〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Hello RoundBottle!\r");
  fflush(stdout);
  sleep(1);
  return 0;
}

test2.c 编译后的执行结果:
在这里插入图片描述

  • 为什么会产生这样的结果? 👆
    在这里插入图片描述

对于要打印到显示器的内容,该内容先会被放入缓冲区当缓冲区被刷新,要打印的内容被从缓冲区拿出来才能被打印在显示器上fflush 可以主动刷新缓冲区;程序进程结束,缓冲区会被自动刷新,然后这个内容会快速的被 接下来要打印到显示器上的操作提示符 给覆盖。

程序进程结束,缓冲区自动刷新如下示例:

  • 〖文件 test3.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Helle RounBottle!");
  sleep(1);
  return 0;
}

test3.c 编译后的执行结果:
在这里插入图片描述
上述代码分析:执行完 sleep 延时函数之后,程序进程结束,缓冲区被刷新,要打印的内容被打印到显示器上,紧接着打印操作提示符。


倒计时

根据上述内容,我们可以根据这个特性写一个“倒计时”:

  1. 从 9 → 0 的倒计时
#include <stdio.h>
#include <unistd.h>
int main()
{
  int i=9;
  while(i>=0)
  {
    printf("%d\r",i);
    fflush(stdout);
    sleep(1);
    i--;
  }

  return 0;
}

运行结果:
在这里插入图片描述

  1. 从 10 → 0 的倒计时
#include<stdio.h>
#include<unistd.h>

int main()
{
  int i=10;
  while(i>=0)
  {
    printf("%2d\r",i);
    fflush(stdout);
    sleep(1);
    i--;
  }
  printf("\n");
  return 0;
}

注意:凡是向显示器打印所有的内容都是字符!例如 printf("%d",123)实际上是在显示器上打印了‘1’‘2’‘3’字符,如果打印 10 ,光标回到开头再打印 9,就会变成——90,依此类推,如下所示:
在这里插入图片描述
所以,更好的打印方式:printf("%2d\r",i);

从10开始的倒计时运行结果:
在这里插入图片描述


进度条

要求:[ 用符号显示进度 ] [进度百分比]
示例:
在这里插入图片描述
同样的,.h文件包含需要的头文件并声明函数,.c文件中定义函数

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc.h
#pragma once

#include<stdio.h>
#include<unistd.h>
#include <string.h>
void process();
[RoundBottle@VM-12-2-centos Progressbar]$ cat main.c
#include "proc.h"

int main()
{
  process();

  return 0;
}

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc1.c
#include "proc.h"

#define MARK '#'
#define NUM 100


void process()
{
  int i=0;
  char str[NUM]={0};
  memset(str,'\0',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%]\n",str,i);
  }
}

1.打印进度条

  • pb1:
[RoundBottle@VM-12-2-centos Progressbar]$ ./pb1
[][0%]
[#][1%]
[##][2%]
[###][3%]
[####][4%]
[#####][5%]
[######][6%]
[#######][7%]
[########][8%]
[#########][9%]
[##########][10%]
[###########][11%]
[############][12%]
[#############][13%]
[##############][14%]
[###############][15%]
[################][16%]
[#################][17%]
[##################][18%]
[###################][19%]
[####################][20%]
[#####################][21%]
[######################][22%]
[#######################][23%]
[########################][24%]
[#########################][25%]
[##########################][26%]
[###########################][27%]
[############################][28%]
[#############################][29%]
[##############################][30%]
[###############################][31%]
[################################][32%]
[#################################][33%]
[##################################][34%]
[###################################][35%]
[####################################][36%]
[#####################################][37%]
[######################################][38%]
[#######################################][39%]
[########################################][40%]
[#########################################][41%]
[##########################################][42%]
[###########################################][43%]
[############################################][44%]
[#############################################][45%]
[##############################################][46%]
[###############################################][47%]
[################################################][48%]
[#################################################][49%]
[##################################################][50%]
[###################################################][51%]
[####################################################][52%]
[#####################################################][53%]
[######################################################][54%]
[#######################################################][55%]
[########################################################][56%]
[#########################################################][57%]
[##########################################################][58%]
[###########################################################][59%]
[############################################################][60%]
[#############################################################][61%]
[##############################################################][62%]
[###############################################################][63%]
[################################################################][64%]
[#################################################################][65%]
[##################################################################][66%]
[###################################################################][67%]
[####################################################################][68%]
[#####################################################################][69%]
[######################################################################][70%]
[#######################################################################][71%]
[########################################################################][72%]
[#########################################################################][73%]
[##########################################################################][74%]
[###########################################################################][75%]
[############################################################################][76%]
[#############################################################################][77%]
[##############################################################################][78%]
[###############################################################################][79%]
[################################################################################][80%]
[#################################################################################][81%]
[##################################################################################][82%]
[###################################################################################][83%]
[####################################################################################][84%]
[#####################################################################################][85%]
[######################################################################################][86%]
[#######################################################################################][87%]
[########################################################################################][88%]
[#########################################################################################][89%]
[##########################################################################################][90%]
[###########################################################################################][91%]
[############################################################################################][92%]
[#############################################################################################][93%]
[##############################################################################################][94%]
[###############################################################################################][95%]
[################################################################################################][96%]
[#################################################################################################][97%]
[##################################################################################################][98%]
[###################################################################################################][99%]
[####################################################################################################][100%]

2.让进度条“动起来”

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc2.c
#include "proc.h"

#define MARK '#'
#define NUM 100

void process()
{
  int i=0;
  char str[NUM]={0};
  memset(str,'\0',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%]\r",str,i); //输出一次进度条后让光标回到一行开头的位置
    fflush(stdout); //刷新缓冲区,将要打印的内容打印到显示器上

    usleep(100000);
  }
  printf("\n");
}
  • \r:回车——使得光标回到行首的位置
  • usleep函数:(ps. microsecond—微秒; 1 微秒 = 10-6s
    在这里插入图片描述
  • 注:循环结束printf("\n");是为了——最后进度条完成进度之后,不被接下来要打印在显示器上的操作提示符给覆盖。

运行结果:
在这里插入图片描述

3.预留进度条的位置并用提示符显示进度条的状态

预留进度条的位置——初始化进度条的内容为空格。

因为进度加载的过程中可能卡住,所以我们需要一个符号来显示进度条的状态——正在加载/加载已经终止/进度加载完成

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc3.c
#include "proc.h"

#define MARK '#'
#define NUM 100


void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%][%c]\r",str,i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

运行结果:
在这里插入图片描述

4.颜色打印

  • 格式:\033[字背景颜色;字体颜色m字符串\033[0m

(这里进度条的样式换了另外的符号表示,这个不重要,看自己需求选择)

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc4.c
#include "proc.h"

#define MARK '-'
#define NUM 100

void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    if(i!=NUM)
    {
      str[i]='>';
    }
    printf("\033[40;44m[%s]\033[0m[%3d%%][%c]\r",str,i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

注意:这里的 i和数组下标是不对应的!
在这里插入图片描述

运行结果:
在这里插入图片描述

只用颜色来表示进度条

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc5.c
#include "proc.h"

#define NUM 100

void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    int num=i;
    while(num--)
    {
      printf("\033[44;37m%c\033[0m",str[num]);
    }
    printf("[%3d%%][%c]\r",i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

运行结果:
在这里插入图片描述


END

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

畋坪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值