【Linux系列P7】进度条小程序的深度解剖(细节满满)

​​​​​

​

前言

大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含

欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门!

订阅专栏阅读: YY的《Linux》系列 ❀❀❀❀❀
【Linux系列-P1】Linux环境的搭建

【Linux系列-P2】 Linux的基本知识与指令

【Linux系列-P3】 Linux的权限

【Linux系列-P4】 Linux基本工具yumvim

目录

一.在Linux中的设置

  • 用vim分别建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可视具体情况设置,文末有简略代码;

  • makefile文件如图所示
    > - ./processbar 执行程序
    细节:为什么在makefile中不用包含头文件?

  • 头文件就在源代码的当前目录下,编译器会自动去找到头文件

二.必备概念梳理

1.回车与换行的区别

  • 回车:光标回到当前行的左端
  • 换行:跳转到当前的下一行
  • PS:现在我们键盘上的ENTER同时兼备了回车和换行的功能,
  • 在C语言中"\n"表示回车加换行,"\r"单单指的是回车;

2.缓冲区概念

引入: 缓冲区是C语言维护的一段内存

  • C语言会默认打开三个输入输出的文件,分别是标准输入流stdin,标准输出流stdout,标准错误stderr

  • 在进度条小程序中,我们要特别注意标准输出流stdout

一."\n"和"\r"在缓冲区中的作用效果差别

  • 众所周知,在Linux中,显示器可以被当作一个文件;
  • 而且显示器默认是行刷新 ,也就是当输出内容配上"\n"后会直接 回车+换行并立刻将内容打印在屏幕上,待睡眠结束后,才会弹出操作框;
  • 而当输出内容配上"\r"后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出;
c 复制代码
#include <stdio.h>
int main()
{
 printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框
 sleep(3);
 return 0;
 
 printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印
}

二.fflush函数

  • fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
  • 在下面代码块中,"hello Makefile!"本来应该待睡眠结束后才会和操作框一起弹出,在此之前存储在缓冲区中;但我们用了fflush(stdout);(stdout是其数据类型),直接将内容从缓冲区中写回显示器文件中;
  • 最终完成的效果是:先行打印,待睡眠结束后才弹出操作框
c 复制代码
#include <stdio.h>
int main()
{
 printf("hello Makefile!\r");
 fflush(stdout);
 sleep(3);
 return 0;
}

三.fflush函数的应用:倒计时功能

1.倒计时功能的实现原理

  • 利用不断的回车 和刷新实现

2.数据类型的表示细节

  • 显示2位数的数字 printf("%2d\r",cnt);
  • 此时功能正常【10,9,8...1,0】
  • 左对齐 printf("%-2d\r",cnt);

3.倒计时功能完整代码

c 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
  int cnt=10;倒计时功能
  while(cnt>=0)
  {
    printf("%d\r",cnt);              此时屏幕出现【10,90,80...10,00】,功能异常;
    fflush(stdout);
    cut--;
    sleep(1);
  }
  return 0;
}

三.设计进度条的各个部分

1.设计进度条主体部分

1.打印时为进度条预留空间

  • 设计一个字符数组,并初始化;此时其为一个空串;
c 复制代码
memset(bar, 0 ,sizeof(bar));

2.调整进度条主体加载方向

  • 在Linux环境下, 行默认是右对齐;所以随着不断的回车与换行,进度条呈现出来的效果是自右向左移动;
  • 我们只需要改为 %-100s 即可
c 复制代码
 printf("[%-100s]\r", bar);

3.进度条主体部分代码

c 复制代码
#include <unistd.h>
int main()
{
  int i = 0;
  
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  
  while(i <= 100 )
 {
   printf("[%-100s]\r", bar);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
}

2.设计百分号进度部分

一.设计细节:"%如何表示"

  • 细节:由于【 % +''字母为 数据类型】,斜杠【%】用【%%】表示

二.实现原理

  • while循环
c 复制代码
int main()
{
 int i = 0;
 while(i <= 100 )
 {
 printf("[%d%%]",i);
 fflush(stdout);
 }
 return 0;
}

3.设计旋转光标部分

一.设计细节:"\ 如何表示"

  • 细节:由于【 \ +''为 转义字符】,斜杠【\】用【\\】表示

二.实现原理

  • 常量字符串配合上【 i++% 4】
  • 【 -r 回车】 +【 fflush刷新图标】; 下一轮while循环,直接覆盖原来的字符,实现光标转动;
c 复制代码
int main()
{
  int i = 0;
  const char *lable="|/-\\";
  while(i <= 100 )
  {
    printf("[%c]\r",lable[i++%4]);
    fflush(stdout);
  }
}

四.进度条完整代码

c 复制代码
#include <unistd.h>
#include <string.h>
int main()
{
  int i = 0;
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  const char *lable="|/-\\";
  while(i <= 100 )
 {
   printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
  printf("\n");
  return 0;
}

​

相关推荐
@兽血沸腾7 分钟前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
且从容.3 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道3 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达5 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.6 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落8 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨8 小时前
WSL2的安装与使用
linux·wsl
微小的鱼8 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng8 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频