当前位置: 首页 > news >正文

【Hello Linux】Linux环境下写的第一个程序 -- 进度条

作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:写出Linux中的第一个小程序 进度条

进度条小程序

    • 行缓冲区概念
    • \r 和 \n
    • 进度条代码和演示

行缓冲区概念

我们首先用两段代码来感受下行缓冲区的存在

在这里插入图片描述
上面的这段代码会输出什么?

毫无疑问 它会输出hello world之后换行 并且还会休眠三秒 之后结束程序

运行结果也符合我们的预期
在这里插入图片描述
可是如果我们将代码改成这样子呢?
在这里插入图片描述
去掉了换行符 那么代码会打印出hello world之后不换行然后休眠三秒结束程序嘛

我们可以编译之后运行试试

我们可以发现并没有按照我们的预期运行 而是直接开始了三秒sleep
在这里插入图片描述
之后再打印出了hello world
在这里插入图片描述
那么这是为什么呢? 按照道理说顺序结构的运行应该是先打印再睡眠的啊

这里其实是因为行缓冲区的存在

我们的显示器对应的是行刷新

即当行被刷新(可以通过换行刷新) 或者被写满的时候才会被打印出来

而hello world既没有写满行 又没有刷新行缓冲区 所以自然不会被打印到显示器当中

\r 和 \n

  • \n 换行 让光标下移一格
  • \r 回车 让光标回到这一行的行首

当我们敲击键盘上的enter键的时候实际上就等于 /n + /r

那么有意思的部分就来了 既然/r是让光标回到这一行的行首

如果我们写下一个数之后立马使用/r回到这一行的行首继续写一个数

那么是不是这个数就被我们覆盖了呢?

其实这个问题的本质就是/r会不会刷新行缓冲区 如果不会那么前面写的数就会被后面写的数覆盖

我们写出下面的代码
在这里插入图片描述
最后的结果是这样子的
在这里插入图片描述
我们可以发现最后什么都没有打印

这是因为\r并不会刷新行缓冲区的缘故 如果想要将每个数字打印出来我们则需要一个行缓冲区刷新函数

这个函数就是 fflush(stdout)

加上这段代码之后我们再编译运行程序试试看
在这里插入图片描述
我们可以发现 这里它就变成了一个倒计时器了
在这里插入图片描述

进度条代码和演示

我们要设计一个进度条首先至少要有100个空间

我们的每个 ‘#’ 号对应着一个空间 有多少个 ‘#’ 也就代表着到了百分之几

我们首先写出下面的代码

其中 usleep的单位是纳秒 1毫秒 = 1000纳秒

所以50000纳秒 = 50毫秒

走100次也就是5000毫秒 也就是说这个程序会在5秒左右走完
在这里插入图片描述
在这里插入图片描述

这是这样子好像还是缺少点什么 我们尝试用两个框框把这个字符串框起来这样子好看一点

此外 我们可以在这框框外面加上一个框框 里面显示程序走了百分之多少了
在这里插入图片描述
在这里插入图片描述
此时这个进度条程序已经初具雏形了

如果我们还想要这个这个进度条是否在工作中则需要在它的最后加上一个旋转的小圈圈 如果这个圈圈还在旋转则表示仍然在加载中

在这里插入图片描述
这样子我们的进度条小程序就完成啦

源代码如下

  1 #include <stdio.h>2 #include <string.h>3 #include <unistd.h>4 5 int main()6 {7   char pb[102];8   memset(pb,'\0',102);9   int i = 0;10   char arr[4];11   arr[0] = '\\';12   arr[1] = '|';13   arr[2] = '/';14   arr[3] = '-';15   while (i != 100)16   {17     pb[i] = '#';18     printf("[%-100s][%%%d][%c]\r",pb,i+1,arr[i%4]);                                                                                                                                               19     fflush(stdout);20     usleep(50000);21     i++;22   }23   return 0;24 }

相关文章:

【Hello Linux】Linux环境下写的第一个程序 -- 进度条

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;写出Linux中的第一个小程序 进度条 进度条小程序行缓冲区概念\r 和 \n进度条代码和演示行缓冲区概念 我们首先用两段代码来感受下行缓…...

【基础】性能测试,从0到实战(手把手教,非常实用)

一、性能基础 什么是性能测试--->本质? 基于协议来模拟用户发送的请求&#xff08;业务模拟&#xff09;&#xff0c;对服务器形成一定负载。关注点&#xff1a;时间性能、空间性能与界面无关 性能测试分类 性能测试&#xff08;狭义&#xff09; 性能测试方法是通过模…...

07-Java异常分类以及处理机制

1.异常概念 Java标准库内建了一些通用的异常&#xff0c;这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。 1.错误&#xff1a;是程序无法处理的错误&#xff0c;表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关&#xff0c;而表示…...

用到的C++的相关知识-----未完待续

文章目录前言一、vector函数的使用1.1 构造向量二、常用函数2.1 矩阵输出函数2.2 向量输出函数2.3 矩阵的使用2.4三、new的用法3.1 内存的四种分区3.2 new的作用3.33.4四、4.14.24.34.4总结前言 只是为方便学习&#xff0c;不做其他用途 一、vector函数的使用 有关的文章 C v…...

JavaScript刷LeetCode拿offer-贪心算法

前言 学习算法的时候&#xff0c;总会有一些让人生畏的名词&#xff0c;比方动态规划&#xff0c;贪心算法 等&#xff0c;听着就很难&#xff1b;而这一 part 就是为了攻破之前一直没有系统学习的 贪心算法&#xff1b; 有一说一&#xff0c;做了这些贪心题&#xff0c;其实…...

selenium

下载并安装selenium 安装&#xff1a;cmd中执行 pip install -i https://pypi.douban.com/simple selenium执行完成后 pip show selenium 可查看安装是否成功安装浏览器驱动&#xff0c;查看当前浏览器的版本选择合适的驱动并下载 chrome的链接&#xff1a;https://chromedrive…...

SpringMVC的视图

转发视图ThymeleafView若使用的视图技术为Thymeleaf&#xff0c;在SpringMVC的配置文件中配置了Thymeleaf的视图解析器&#xff0c;由此视图解析器解析之后所得到的是ThymeleafView。解析&#xff1a;当控制器方法中所设置的视图名称没有任何前缀时&#xff0c;此时的视图名称会…...

idea使用本地代码远程调试线上运行代码---windows环境

场景&#xff1a; 今天在书上看了一个代码远程调试的方法&#xff0c;自己本地验证了一下感觉十分不错&#xff01;&#xff01; windows环境&#xff1a; 启动测试jar包&#xff1a;platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 测试工具&#xff1a;postman,idea 应…...

简单记录简单记录

目录1.注册Gmail2.注册ChatGPT3.验证“真人”使用4.开始使用1.注册Gmail 第一步先注册一个谷歌邮箱&#xff0c;你也可以使用微软账号&#xff0c;大部分人选择使用gmail。 申请谷歌邮箱 选择个人用途创建账号即可。 &#x1f4cc;温馨提示&#xff1a; 你直接使用guo内的网…...

源码系列 之 ThreadLocal

简介 ThreadLocal的作用是做数据隔离&#xff0c;存储的变量只属于当前线程&#xff0c;相当于当前线程的局部变量&#xff0c;多线程环境下&#xff0c;不会被别的线程访问与修改。常用于存储线程私有成员变量、上下文&#xff0c;和用于同一线程&#xff0c;不同层级方法间传…...

C语言入门(1)——特点及关键字

1、C特点及与Java区别 1.1、C特点 面向过程 一般用于嵌入式开发、编写最底层的程序、操作系统 可以直接操作内存 可以封装动态库 不容易跨平台 有指针 可以直接操作串口 线程更加灵活 和硬件打交道速度是最快的 1.2、和Java区别 C是C的增强版&#xff0c;增加了一些新的特性&…...

react中useEffect和useLayoutEffect的区别

布局上 useEffect在浏览器渲染完成后执行useLayoutEffect在DOM更新后执行 特点 useLayoutEffect 总是比 useEffect 先执行&#xff1b;useLayoutEffect与componentDidMount、componentDidUpdate调用时机相同&#xff0c;都是在DOM更新后&#xff0c;页面渲染前调用&#xff1…...

NoSQL(非关系型数据库)与SQL(关系型数据库)的差别

目录 NoSQL(非关系型数据库)与SQL(关系型数据库)的差别 1.数据结构&#xff1a;结构化与非结构化 2.数据关联&#xff1a;关联性与非关联性 3.查询方式&#xff1a;SQL查询与非SQL查询 4.事务特性&#xff1a;ACID与BASE 分析ACID与BASE的含义&#xff1a; 5.存储方式&am…...

new bing的申请与使用教程

文章目录新必应申请新必应免代使用教程总结新必应申请 下载安装 Edge dev 版本&#xff0c;这个版本可以直接使用 对于没有更新的用户而言&#xff0c;不容易找到入口&#xff0c;所以我们直接使用 集成new bing的dev版本 Edge dev 下载链接&#xff1a;https://www.microso…...

yaml配置文件

最近在写代码&#xff0c;发现随着网络的增加&#xff0c;代码变得越来越冗余&#xff0c;所以就想着写一个网络的配置文件&#xff0c;把网络的配置放到一个文件中&#xff0c;而不再主函数中&#xff0c;这样代码开起来就好看了&#xff0c;调试的时候也方便了。之前写过一篇…...

284. 顶端迭代器

请你在设计一个迭代器&#xff0c;在集成现有迭代器拥有的 hasNext 和 next 操作的基础上&#xff0c;还额外支持 peek 操作。 实现 PeekingIterator 类&#xff1a; PeekingIterator(Iterator nums) 使用指定整数迭代器 nums 初始化迭代器。 int next() 返回数组中的下一个元…...

自学前端最容易犯的10个的错误,入门学前端快来看看

在前端学习过程中&#xff0c;有很多常见的误区&#xff0c;包括过度关注框架和库、缺乏实践、忽视算法和数据结构、忽视浏览器兼容性、缺乏团队合作经验、忽视可访问性、重构次数过多、没有关注性能、缺乏设计知识以及没有持续学习等。要避免这些误区&#xff0c;应该注重基础…...

【ADRC控制】使用自抗扰控制器调节起动机入口压力值

以前只知道工业控制中用的是PID控制&#xff0c;然而最近了解到实际生产中还在使用ADRC控制&#xff0c;而且使用效果还优于PID控制&#xff0c;遂找了几篇文献学习学习。 0 引言 自抗扰控制&#xff08;Active Disturbances Rejection Controller&#xff0c;ADRC&#xff09;…...

剑指 Offer Day2——链表(简单)

目录剑指 Offer 06. 从尾到头打印链表剑指 Offer 24. 反转链表剑指 Offer 35. 复杂链表的复制剑指 Offer 06. 从尾到头打印链表 原题链接&#xff1a;06. 从尾到头打印链表 最容易想到的思路就是先从头到尾打印下来&#xff0c;然后 reverse 一下&#xff0c;但这里我们使用递归…...

Final Cut Pro 10.6.5

软件介绍Final Cut Pro 10.6.5 已通过小编安装运行测试 100%可以使用。Final Cut Pro 10.6.5 破解版启用了全新的矩形图标&#xff0c;与最新的macOS Ventura设计风格统一&#xff0c;支持最新的macOS 13 文图拉系统&#xff0c;支持Apple M1/M2芯片。经过完整而彻底的重新设计…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...