文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【闪击Linux系列P7】进度条小程序の深度解剖

2023-08-16 15:50

关注

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

前言

大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含
在这里插入图片描述

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

订阅专栏阅读: YY的《Linux》系列 ❀❀❀❀❀
【Linux系列-P1】Linux环境的搭建
【Linux系列-P2】 Linux的基本知识与指令
【Linux系列-P3】 Linux的权限
【Linux系列-P4】 Linux基本工具[yum][vim]

一.在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”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出
#include int main(){ printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框 sleep(3); return 0;  printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印}

二.fflush函数

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

#include #include 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.打印时为进度条预留空间

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

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

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

3.进度条主体部分代码

#include 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循环
int main(){ int i = 0; while(i <= 100 ) { printf("[%d%%]",i); fflush(stdout); } return 0;}

3.设计旋转光标部分

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

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

二.实现原理

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

四.进度条完整代码

#include #include 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;}

来源地址:https://blog.csdn.net/YYDsis/article/details/131776415

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯