进度条小程序

在这里插入图片描述

文章目录

  • 铺垫
    • 回车换行
    • 缓冲区
      • 概述
      • 强制冲刷缓冲区
  • 简单实现倒计时功能
  • 进度条小程序
    • 版本一
      • 实例代码
      • 效果展示
      • 分析
    • 版本二

铺垫

回车换行

回车和换行是两个独立的动作

回车是将光标移动到当前行的最开始(最左侧)

换行是竖直向下平移一行

在C语言中,\n是同时进行了回车换行,\r实现了回车操作

缓冲区

概述

先来看一个小现象:

实例代码:

#include<stdio.h>                                                                                                                       
#include<unistd.h>
int main()
{printf("hello gwj,hello Linux...\n");sleep(3);return 0;
}

在这里插入图片描述

运行mytest.exe执行程序,会输出hello gwj,hello Linux...,紧接着调用sleep函数,休眠三秒

如果将printf函数中\n删掉,会出现什么结果呢??

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

现象:先休眠三秒,在最后结束的狮虎打印出内容
这这种场景中,sleep函数和printf函数,哪一个先运行的呢??
答案是printf先运行,在休眠的这三秒时间里,printf已经执行完了,字符串被保存在缓冲区

缓冲区的概念需要在操作系统层面上理解,单纯在语言基础上是很难理解的

缓冲区是一个内存空间,当休眠的时候,字符串在缓冲区里,当程序结束return 0时,,强制冲刷缓冲区,再打印出字符串。

强制冲刷缓冲区

任何一个C语言程序都会默认打开三个流:

  • stdin:标准输入流
  • stdout:标准输出流
  • stderr比爱准错错误

可以通过fflush函数来刷新缓冲区

在这里插入图片描述

示例代码:

   #include<stdio.h>#include<unistd.h>int main(){printf("hello gwj,hello Linux...");fflush(stdout);                                                                                                                       sleep(3);return 0;}

在这里插入图片描述
现象:

在这里插入图片描述

简单实现倒计时功能

示例代码:

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5   int cnt=9;6   while(cnt>=0)7   {8     printf("%d\r",cnt);9     fflush(stdout);                                                                                                                     10     cnt--;11     sleep(1);12   }13   return 0;14 }

效果展示:

在这里插入图片描述

代码解读:
倒计时使用新数字去覆盖老数字,并且都出一同一位置,因此在printf函数里不能使用\n,使用换行会让新数字在老数字下面。

正确做法是在printf函数后面使用\r回车符号,每打印一个数字,让光标回到这一行最开始的位置,这样打印出来的新数字就会覆盖旧数字。

但是\r不会冲刷缓冲区,因此每打印完一个数字调用 fflush(stdout)来冲刷缓冲区。

进度条小程序

版本一

实例代码

Processbar.h文件:

#pragma once #include<stdio.h>void ProcBar();      
#include"Processbar.h"    
#include<string.h>    
#include<unistd.h>    #define Length 101    
#define Style '#'    const char *lable="|/-\\";    //version1:    
void ProcBar()    
{    char bar[Length];    memset(bar,'\0',sizeof(bar));    int len=strlen(lable);    int cnt=0;    while(cnt<=100)    {    printf("[%-100s][%3d%%][%c]\r",bar,cnt,lable[cnt%len]);                                                                                 fflush(stdout);    bar[cnt]=Style;    cnt++;    usleep(20000);    }    printf("\n");    
}  

效果展示

在这里插入图片描述

分析

该进度条的原理是一次比一次多打印一点内容、

定义一个bar数组,通过循环,每次多打印一个字符,视觉上就会形成进度条是从右向左走

由于进度条每次打印是在同一行上,因此需要\r符号,让光标回到最开始的位置

版本二

Processbar.h文件:

#pragma once    #include <stdio.h>    typedef void(*callback_t)(double, double);    void ProcBar(double total, double current);                                                                                                 

Main.c文件:

void download(double filesize,callback_t cb)    
{    double current = 0.0;    printf("download begin, current: %lf\n", current);    while(current <= filesize)    {    cb(filesize, current);    //从网络中获取数据                                                                                                                  usleep(100000);    current += bandwidth;    }    printf("\ndownload done, filesize: %lf\n",filesize);    
}    int main()    
{    download(100*1024*1024,ProcBar);    download(2*1024*1024,ProcBar);    return 0;    
}    

Processbar.c文件:

#include"Processbar.h"    
#include<string.h>    
#include<unistd.h>    #define Length 101    
#define Style '#'  //version 2                                                                   
void ProcBar(double total, double current)                                    
{                                                                             char bar[Length];                                                         memset(bar, '\0', sizeof(bar));                                           int len = strlen(lable);                                                  int cnt = 0;                                                              double rate = (current*100.0)/total;                                      int loop_count = (int)rate;                                               while(cnt <= loop_count)                                                  {                                                                         bar[cnt++] = Style;                                                   usleep(20000);                                                                                                                      }                                             printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt%len]);    fflush(stdout);    
}  

效果展示:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

怿星科技测试实验室(EPT LABS)服务介绍

据中国汽车工业协会数据&#xff0c;2023年我国汽车产销量分别达3016.1万辆和3009.4万辆&#xff0c;年产销量双双创历史新高&#xff0c;汽车行业进入了新时代。新汽车时代下的OEM竞争更激烈&#xff0c;汽车电子架构更复杂&#xff0c;研发周期更短&#xff0c;软件迭代更快&…

VSCODE中使用Django处理后端data和data models

链接&#xff1a; Python and Django tutorial in Visual Studio Code MVC的理解 在实际的程序中采用MVC的方式进行任务拆分。 Model&#xff08;模型&#xff09;负责封装应用程序的数据和业务逻辑部分。Model包含数据结构&#xff0c;数据处理逻辑以及相关的操作方法&#…

NetSuite 中Inventory Adjustment批次物料CSV导入分析二

上一篇最后我们有一个遗留问题是说&#xff0c;调增和调减的操作是否能在一个CSV导入模版中进行操作&#xff0c;经过测试后发现&#xff0c;是可以的&#xff0c;只是External ID需要在设置的时候注意对应好就OK。这里建议大家先查看上一篇文章&#xff0c;因为有一些完全重复…

Day14-Linux系统基础权限知识精讲

Day14-Linux系统基础权限知识精讲 1. chattr2. Linux系统权限。2.1 基础权限介绍2.2 画图讲解2.3 文件和目录权限细节总结2.4 建环境测试2.5 数字权限设置2.6 字符权限设置 给文件加特殊属性&#xff0c;实现特殊功能的命令。 1. chattr a 只能追加内容&#xff0c;不能删除。…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

Git合并固定分支的某一部分至当前分支

在 Git 中&#xff0c;通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码&#xff0c;可以使用以下两种方法&#xff1a; 1.批量文件合并 1.1.创建并切换到一个新的临时分支 首先&#xff0c;从要合并的源分支&#xff08;即要…

C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;四&#xff09;】 1、this指针1.1、this指针的作用1.2、this指针和静态成员函数 2、静态成员变量和静态成员函数2.1、基本概念2.2、基本概念总结2.3、如何访问静态成员2.4、静态成员变量的使用场景&#xff08;重要&…

浏览器---浏览器/http相关面试题

1.localStorage和sessionStorage 共同点&#xff1a;二者都是以key-value的键值对方式存储在浏览器端&#xff0c;大小大概在5M。 区别&#xff1a; &#xff08;1&#xff09;数据有效期不同&#xff1a;sessionStorage仅在当前浏览器窗口关闭之前有效&#xff1b;localStorag…

Eigen:Vector3d 变量初始化遇到的问题

Eigen:Vector3d 变量初始化遇到的问题 2024.2.22 日 &#xff0c;在使用 Eigen:Vector3d 这个类型的 变量&#xff0c;在类中进行初始化时 遇到了如下问题&#xff1a; 首先在类的声明内部&#xff0c;是不能声明完&#xff0c;再给变量赋值的&#xff0c;不管是 Eigen:Vector…

【 Flutter】安装、运行坑记录

运行demo报错 Exception in thread “main” java.net.ConnectException: Connection timed out: connect原因&#xff1a;网络问题&#xff0c;gradle包未能下载 解决方案&#xff1a;配置android studio代理&#xff0c;重新打开项目&#xff0c;as会自动下载缺失依赖

(done) 如何判断一个矩阵是否可逆?

参考视频&#xff1a;https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆&#xff0c;那么 A 和 B 相似。原因&#xff1…

安卓开发:挑战每天发布一个封装类02--Wav录音封装类AudioChannel 1.0

简介 库名称&#xff1a;AudioChannel 版本:1.0 由于项目需求录音并base64编码存到服务器中&#xff0c;就顺手改装了一个别人的封装类 原封装类地址:Android AudioRecord音频录制wav文件输出 - 简书 (jianshu.com) 描述&#xff1a;此封装类基于AudioRecord实现wav的音频…

WEB相关工具(wget、curl、ab)

目录 一、wget 1、wget基本语法 2、wget帮助的更多选项 二、curl 1、curl基本语法 2、curl命令下载 3、curl命令基本用法 3.1 curl伪装 3.2 提取状态码 3.3 提取本地IP地址 3.4 提取远端服务器IP地址 3.5 提取本地端口 3.6 提取远端服务器端口 三、压力测试工具…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎&#xff0c;而xLua是一个为Unity开发者提供的Lua框架&#xff0c;可以让开发者使用Lua语言来进行游戏开发。在本文中&#xff0c;我们将介绍如何搭建Unity xLua开发环境&#xff0c;并进行基础进阶的学习。 环境搭建 首先&#xff0c;我们需…

高维数据的中介效应【中介分析】《R包:HIMA》

允许基于高级中介筛选和惩罚回归技术来估计和测试高维中介效应 Hima包浏览 高维中介示意图 图1. 在暴露和结果之间有高维中介的情况 本包的作用 在确定独立筛选和极小极大凹惩罚技术的基础上&#xff0c;采用联合显著性检验方法对调解效果进行检验。使用蒙特卡罗模拟研究来展…

Python爬虫实战入门:爬取360模拟翻译(仅实验)

文章目录 需求所需第三方库requests 实战教程打开网站抓包添加请求头等信息发送请求&#xff0c;解析数据修改翻译内容以及实现中英互译 完整代码 需求 目标网站&#xff1a;https://fanyi.so.com/# 要求&#xff1a;爬取360翻译数据包&#xff0c;实现翻译功能 所需第三方库 …

2024什么样的大路灯比较好?5大爆款落地灯推荐必看!

大路灯作为一个可以照明&#xff0c;让室内环境光线更加舒适的电器&#xff0c;能够减少用眼时不良光线带来的疲劳感&#xff0c;营造接近自然光的舒适光&#xff0c;受到很多家长的关注&#xff01; 但现在市面有很多不良商家推出的大路灯虚标参数&#xff0c;实际护眼性能很低…

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2

vue中使用AraleQRCode生成二维码

vue中使用AraleQRCode生成二维码 问题背景 本文介绍vue中生成二维码的一种方案&#xff0c;使用AraleQRCode来实现。 问题分析 &#xff08;1&#xff09;安装对应的依赖包 npm i arale-qrcode --save &#xff08;2&#xff09;完整代码如下: <template><!-…

解决docker中运行的jar包连不上前端程序

目录 检查端口映射 查看容器的 IP 地址 检查容器网络设置 防火墙和网络策略 前端程序配置 跨域资源共享 (CORS) 日志查看 连接问题通常涉及到网络配置和端口映射。确保你在 Docker 中运行的 JAR 包可以被前端程序访问&#xff0c;可以采取以下步骤来解决问题&#xff1a…