前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】进度条小程序の深度解剖(7)

【Linux】进度条小程序の深度解剖(7)

作者头像
YY的秘密代码小屋
发布2024-01-22 20:52:10
1120
发布2024-01-22 20:52:10
举报
文章被收录于专栏:C++系列

​​​​

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

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

一.在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”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出
代码语言:javascript
复制
#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是其数据类型),直接将内容从缓冲区中写回显示器文件中;
  • 最终完成的效果是:先行打印,待睡眠结束后才弹出操作框
代码语言:javascript
复制
#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.倒计时功能完整代码
代码语言:javascript
复制
#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.打印时为进度条预留空间

  • 设计一个字符数组,并初始化;此时其为一个空串
代码语言:javascript
复制
memset(bar, 0 ,sizeof(bar));
2.调整进度条主体加载方向

  • 在Linux环境下, 行默认是右对齐;所以随着不断的回车与换行,进度条呈现出来的效果是自右向左移动;
  • 我们只需要改为 [%-100s] 即可
代码语言:javascript
复制
 printf("[%-100s]\r", bar);
3.进度条主体部分代码
代码语言:javascript
复制
#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循环
代码语言:javascript
复制
int main()
{
 int i = 0;
 while(i <= 100 )
 {
 printf("[%d%%]",i);
 fflush(stdout);
 }
 return 0;
}

3.设计旋转光标部分

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

  • 细节:由于【 \ +''为 转义字符】,斜杠【\】用【\\】表示
二.实现原理

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

四.进度条完整代码

代码语言:javascript
复制
#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;
}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.在Linux中的设置
  • 二.必备概念梳理
    • 1.回车与换行的区别
      • 2.缓冲区概念
        • 一.“\n”和“\r”在缓冲区中的作用效果差别
        • 二.fflush函数
        • 三.fflush函数的应用:倒计时功能
    • 三.设计进度条的各个部分
      • 1.设计进度条主体部分
        • 2.设计百分号进度部分
          • 3.设计旋转光标部分
          • 四.进度条完整代码
          相关产品与服务
          云开发 CloudBase
          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档