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

news2024/11/26 7:33:57

作者:@小萌新
专栏:@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 }

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

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

相关文章

结合ENVI和PIE Hyp讲述高光谱遥感信息处理技术,包括光谱恢复、光谱库建立、光谱特征提取、混合像元分解、图像分类及精度检验

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…

05 OpenCV色彩空间处理

色彩空间&#xff08;Color Space&#xff09;是一种用于描述颜色的数学模型&#xff0c;它将颜色表示为多维向量或坐标&#xff0c;通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异&#xff0c;不同的…

ChatGPT写代码水平惊艳到我,很性感但有点危险

这几天属实是被ChatGPT刷屏了&#xff0c;十年寒窗无人问&#xff0c;一举成名天下知。不少人和ChatGPT对话后&#xff0c;都觉得自己像个傻逼。这位“最强懂哥”可以轻松应答各种问题&#xff0c;给出的答案不仅条理清晰&#xff0c;还会引用例子支撑观点。让它帮忙写程序&…

九、初识卷积

文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时&#xff0c;神经网络的前几层需要完成对图像的边缘检测任务&#xff0c;所谓的边缘检测就是让计算机识别出一张图片的垂直…

【智能计算数学】微积分

高数问题解决流程引例&#xff1a;回归回归引例&#xff1a;分类分类线性可分FLD线性不可分智能计算讨论范围下降法为什么要用下降法&#xff1f;- 解析解很难写出公式或很复杂难计算有哪些常用的下降法&#xff1f;- 梯度下降&高斯-牛顿法梯度下降&#xff08;Gradient De…

初步认识操作系统(Operator System)

操作系统一&#xff0c;冯诺依曼体系结构内存的重要作用二&#xff0c;操作系统的概念三&#xff0c;设计操作系统的目的三&#xff0c;操作系统在计算机体系中的定位四&#xff0c;操作系统是如何进行管理的一&#xff0c;冯诺依曼体系结构 在众多计算机相关的书籍中&#xff…

linux安装docker和Docker Compose

1、安装环境 此处在Centos7进行安装&#xff0c;可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上&#xff0c;可以使用以下命令查看 uname -r 2、用yum源安装 2.1 查看是否已安装docker列表 yum list inst…

Doom流量回放工具导致的测试环境服务接口无响应的排查过程

Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述&#xff1a; a)部分接口&#xff08;A组接口&#xff09;无响应 b)部分接口&#xff08;B组接口&#xff09;正常响应 c)还有一部分接口&#xff08;C组接口&#xff09;,场景1无响应&#xff0c;场景2正常响…

ChatGPT 桌面应用程序 for macOS, Linux, Windows v0.10

请访问原文链接&#xff1a;https://sysin.org/blog/chatgpt/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org ChatGPT 是什么 ChatGPT 是 OpenAI 公司开发的一种基于对话优化的语言模型。用俗话说就是“人工智障”聊天机器…

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包&#xff0c;而客户端和服务端都会指定自己的初始…

Tomcat构建

软件架构C/S:Client/Server.需要安装才能使用。B/S:Brower/Server。有浏览器就可以。资源分类动态资源&#xff1a;每个用户访问相同的资源后&#xff0c;得到的结果可能不一样&#xff0c;称为动态资源。动态资源被访问后&#xff0c;先转换为静态资源&#xff0c;再被浏览器解…

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码 SemaphoreHandle_t freeBowl NULL;//初始状态有5个空碗 SemaphoreHandle_t Mantou NULL;//初始状态没有馒头&#xff0c;从零开始计数 int queue[5]; //用数组模拟空碗&#xff0c;对数组取余操作&#xff0c;模拟循环链…

如何利用 ESLint 规范 TypeScript 代码

ESLint 是一种 JavaScript linter&#xff0c;可以用来规范 JavaScript 或 TypeScript 代码&#xff0c;本文教你怎么在项目中快速把 ESLint 安排上。 前导 怎么写出优雅的代码是一个老生常谈的话题&#xff0c;这其中包含了太多内容可聊&#xff0c;但搞一套标准规范绝对是万…

opencv锁定鼠标定位

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

【MySQL进阶】 存储引擎 索引

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

如何编译和运行C++程序?

C 和C语言类似&#xff0c;也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器&#xff0c;它们除了可以运行C语言程序&#xff0c;还可以运行 C 程序&#xff0c;步骤是一样的&#…

SpringMvc的请求和响应

SpringMvc的数据响应 1.springmvc的数据相应方式 &#xff08;1&#xff09;页面跳转 直接返回字符串 通过ModelAndView对象返回 &#xff08;2&#xff09;回写数据 直接返回字符串 返回对象或集合 页面跳转 jsp页面 <% page contentType"text/html;charsetUTF-8&q…

ChatGPT的出现,为我们展现出来的是智能社会来临的美好图景

ChatGPT&#xff0c;的确是当下最炙手可热的一个话题。然而&#xff0c;人们对于ChatGPT的认识&#xff0c;依然还是仅仅停留在ChatGPT本身&#xff0c;而没有将它与它的「前任」——元宇宙、web3.0&#xff0c;乃至NFT联系在一起。如果在看待ChatGPT的时候&#xff0c;将它放置…

KDJ日周月金叉共振指标

昨天介绍了MACD多周期共振指标公式&#xff0c;KDJ通过类似的写法&#xff0c;也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移&#xff0c;接近周末月末的信…

如何用Redis实现延迟队列

背景前段时间有个小项目需要使用延迟任务&#xff0c;谈到延迟任务&#xff0c;我脑子第一时间一闪而过的就是使用消息队列来做&#xff0c;比如RabbitMQ的死信队列又或者RocketMQ的延迟队列&#xff0c;但是奈何这是一个小项目&#xff0c;并没有引入MQ&#xff0c;我也不太想…