【Linux】 Linux 小项目—— 进度条

进度条

  • 基础知识
    • 1 \r && \n
    • 2 行缓冲区
    • 3 函数介绍
  • 进度条实现
    • 版本 1
      • 代码实现
      • 运行效果
    • 版本2
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

基础知识

1 \r && \n

我们熟悉的\n 实际上是两个操作 换行与回车
回车是将光标回到行开头

换行时将光标移到下一行
而“\r” 执行的是回车操作

我们可以看一下例子:

  1. 使用 “ \n ” 在这里插入图片描述
    来看效果:

在这里插入图片描述

  1. 不使用“ \n ”
    在这里插入图片描述

来看效果:
在这里插入图片描述
为什么会产生这样的区别???
原因就在缓冲区

2 行缓冲区

缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

“\n” 可以清空缓冲区 使内容出现在显示器是上
fflush()函数也可以完成类似功能。

3 函数介绍

  1. Sleep函数
    Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。
    注意在VC中Sleep中的第一个英文字符为大写的"S"
    在标准C中是sleep(S不要大写),下面使用大写的来说明,具体用什么看你用什么编译器。简单的说VC用Sleep,别的一律使用sleep。
    其中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000);另外还需要引用头文件 #include <windows.h>
  2. usleep()函数
    usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒)
    注意需要引头文件 #include <unistd.h>个函数不能工作在windows 操作系统中。用在Linux的测试环境下面

进度条实现

版本 1

代码实现

progressbar.h

  1 #include <stdio.h>2 #include<string.h>3 #include<unistd.h>4                                                                                                                                                                               5 void progressbar();

progressbar.c

  1 #include"progressbar.h"2 3 #define style '#' 4 #define Length 1015 6 void progressbar(){7   char str[Length];8   memset(str,'\0',sizeof(str));9 10   int cnt = 0;11 12   while(cnt<101){13     printf("[%-100s][%3d%%]\r",str,cnt);14     fflush(stdout);15     str[cnt++] = style;                                                                                                                                                       16     usleep(20000);17   }18   printf("\n");19 20 }

main.c

  1 #include"progressbar.h"2 3 int main(){4   progressbar();5   return 0;                                                                                                                                                                   6 }

运行效果

在这里插入图片描述

版本2

显然 没有进度条会单独使用,一般都是搭配下载使用。
所以接下来我们来模拟一些下载过程:
progressbar.c

  1 #include"progressbar.h"2 3 #define style '#' 4 #define Length 1015 6 void progressbar(double total, double current){7   char str[Length];8   memset(str,'\0',sizeof(str));9 10   int cnt = 0;11   double rate =(current * 100.0) / total;12   int loop = (int)rate;13 14   while(cnt <= loop){15     str[cnt++] = style;16   }17 18   if(rate >=100){19     printf("[%-100s][%0.1lf%%]\r",str,100.0);                                                                                                                                 20   }21   else22     printf("[%-100s][%0.1lf%%]\r",str,rate);23 24   fflush(stdout);25 26 }

main.c

  1 #include"progressbar.h"2 3 double bandwidth = 1.0 * 1024 *1024;4 5 void download(double total){6 7   double current = 0;8   printf("Download Begin!\n");9 10   while(current <= total){11 12     current += bandwidth;                                                                                                                                                     13     progressbar(total,current);14     usleep(1000000);15   }16   printf("\ndownload done, filesize: %.1lf\n",total);17   printf("\n");18 }19 int main(){20 21   download(7.8*1024*1024);22 23 24   return 0;25 }

看看效果:
在这里插入图片描述
这下就非常类似我们的下载过程了!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你知道.NET的字符串在内存中是如何存储的吗?

一、字符串对象的内存布局 从“值类型”和“引用类型”来划分&#xff0c;字符串自然属于引用类型的范畴&#xff0c;所以一个字符串对象自然采用引用类型的内存布局。引用类型实例的内存布局总的来说整个内存布局分三块&#xff1a;ObjHeader TypeHandle Payload。对于一般…

面试经典150题——有效的数独

​"Strive not to be a success, but rather to be of value." - Albert Einstein 1. 题目描述 2. 题目分析与解析 2.1 暴力求解 没思路&#xff0c;老规矩&#xff0c;先来一次笨办法&#xff0c;先把步子迈出去&#xff0c;因为可能笨办法写着写着就会有更多的…

vue的网络请求以及封装

①先备好springboot的接口 ②安装依赖 在vue中安装网络请求工具的依赖&#xff1a; npm i axios③简单的demo 直接通过axios请求尝试一下&#xff1a; <script> import axios from "axios";export default {name: HomeView,data() {return {users:[]}}, …

如何监控另一台电脑屏幕画面?如何远程监控电脑屏幕?

在数字化时代&#xff0c;随着远程工作和协作的普及&#xff0c;电脑屏幕监控的需求也日益增长。无论是出于安全考虑、提高员工工作效率&#xff0c;还是确保企业机密的保密性&#xff0c;电脑屏幕监控都成为了企业不可或缺的管理工具。那么&#xff0c;如何监控另一台电脑屏幕…

用HTML5 Canvas创造视觉盛宴——动态彩色线条效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- 声明文档类型为XHTML 1.0 Transitional -…

微信网页版能够使用(会顶掉微信app的登陆)

一、文件结构 新建目录chrome新建icons&#xff0c;其中图片你自己找吧新建文件manifest.json新建文件wx-rules.json 二、文件内容 对应的png你们自己改下 1、manifest.json {"manifest_version": 3,"name": "wechat-need-web","author…

飞天使-k8s知识点17-kubernetes实操2-pod探针的使用

文章目录 探针的使用容器探针启动实验1-启动探针的使用-startupprobeLiveness Probes 和 Readiness Probes演示若存在started.html 则进行 探针的使用 kubectl edit deploy -n kube-system corednslivenessprobe 的使用 livenessProbe:failureThreshold: 5httpGet:path: /heal…

解决platform创建项目失败问题

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 platform创建项目失败&#xff0c;解决办法 1、现象描述…

飞天使-k8s知识点20-kubernetes实操5-pod更新与暂停-statefulset

文章目录 资源调度 Deployment&#xff1a;扩缩容资源调度 Deployment&#xff1a;更新的暂停与恢复资源调度 StatefulSet&#xff1a;定义一个有状态服务headless service 金丝雀发布 资源调度 Deployment&#xff1a;扩缩容 扩容和缩容&#xff0c;常用的功能 scale[rootkub…

[word] word技巧分享_word巧用标题快捷键 #笔记#媒体

word技巧分享_word巧用标题快捷键 不管是日常生活还是工作事物&#xff0c;现在都离不开office软件 很多抱着 Mac 的同学&#xff0c;在处理文档的时候&#xff0c;都会突然觉得Mac不香了&#xff0c; 悄悄地打开 Windows 虚拟机。 在面对文档修改时&#xff0c;最最头疼的就…

java8-重构、测试、调试

8.1.1 改善代码的可读性 改善代码的可读性到底意味着什么?我们很难定义什么是好的可读性&#xff0c;因为这可能非常主观。通常的理解是&#xff0c;“别人理解这段代码的难易程度”。改善可读性意味着你要确保你的代码能非常容易地被包括自己在内的所有人理解和维护。为了确保…

【学习心得】Python好库推荐——captcha

Captcha的全称是"Completely Automated Public Turing test to tell Computers and Humans Apart",完全自动化的图灵测试,用于区分计算机和人类。说直白点就是验证码&#xff0c;验证你是人而不是爬虫。 Captcha的原理就是利用计算机目前还无法进行实时视觉辨识和字符…