【Linux】 -- 进度条小程序

news2024/9/28 21:29:33

Linux第一个小程序-进度条

目录

行缓冲区概念

\r 和 \n

进度条代码和演示


 

行缓冲区概念

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

#include<stdio.h>                                                                                                                                                                           
#include<unistd.h>    
    
int main()    
{                    
    printf("hello world\n");    
    //printf("hello world");    
    
    //fflush(stdout);           //强制刷新
    
    sleep(5);    
    
    return 0;    
} 

上面的这段代码会输出什么?

它会输出hello world之后换行 并且还会休眠五秒 之后结束程序

运行结果也符合我们的预期

839d3ffa088946108d5ea9de3cdf9d7c.png

 可是如果我们将代码改成这样子呢?

#include<stdio.h>                                                                                                                                                                           
#include<unistd.h>    
    
int main()    
{                    
    //printf("hello world\n");    
    printf("hello world");    
    
    //fflush(stdout);           //强制刷新
    
    sleep(5);    
    
    return 0;    
} 

c4344a7dfca44adb8751f906031ac359.png

并没有按照我们的预期运行 而是直接开始了五秒sleep 之后再打印出了hello world

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

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

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

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

 

 

\r 和 \n

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

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

既然 /r 是让光标回到这一行的行首

如果我们写下一个数之后立马使用 /r 回到这一行的行首继续写一个数 那么这个数就被我们覆盖了

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

我们写出下面的代码

#include<stdio.h>    
#include<unistd.h>    
    
int main()    
{      
    int count = 10;                                                                                                                                                                         
    while(count)      
    {      
      printf("%2d\r", count);      

      fflush(stdout);      

      count--;      
      sleep(1);      
    }      
                                 
    return 0;                
} 

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

这个函数就是 fflush(stdout)

16873399c40246399cbbd98158b23305.png

 

 

进度条代码和演示

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

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

我们首先写出下面的代码

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

所以50000纳秒 = 50毫秒

走100次也就是5000毫秒 也就是说这个程序会在5秒左右走完

#include <stdio.h>                                                                                                                                                                          
#include <unistd.h>    
#include <string.h>    
    
int main()    
{    
#define NUM 100    
    char bar[NUM+1];    
    memset(bar, '\0', sizeof(bar));    
    
    const char* lable = "|/-\\";    
    
    int i = 0;    
    while(i <= 100)    
    {    
      printf("\033[31m[%-100s][%3d%%][%c]\r", bar, i, lable[i%4]);    
      fflush(stdout);    
      bar[i] = '=';    
      i++;    
      usleep(50000);    
    }    
    
    printf("\n");    
    return 0;    
}    

3733a3a533d445fd93f12a3f8b952226.png

152300cfdcc5420e8ec39f82ebe80044.png

这样也是类似的

  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/399010.html

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

相关文章

C++回顾(十四)—— 函数模板

14.1 概述 所谓函数模板(function template)&#xff0c;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体指定&#xff0c;用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替&#xff0c;不必定义多个函数&a…

数据分析方法08用户画像

用户画像 1、 概念 用户画像是指用户信息标签化&#xff0c;通过收集用户多维度的信息数据&#xff08;如人口统计属性&#xff0c;社会属性&#xff0c;行为偏好&#xff0c;消费习惯等&#xff09;&#xff0c;对其进行统计&#xff0c;分析&#xff0c;从而抽象出用户信息…

Ubuntu c++ MySQL数据库操作

mysql安装sudo apt-get install updatesudo apt-get install mysql-server libmysqlclient-dev mysql-workbenchmysql启动/重启/停止sudo service mysql start/restart/stop登录mysql命令&#xff1a;mysql -uroot -p错误异常&#xff1a;解决办法&#xff1a;修改mysqld.cnf配…

软件测试员如何进行产品测试?

一般来讲&#xff0c;当软件成为一个成功的产品后&#xff0c;产品测试工作就会复杂很多。比如拥有的用户量大&#xff0c;迭代频繁&#xff0c;测试的周期短&#xff0c;重复性强。面对紧张复杂的产品测试工作&#xff0c;软件测试员应怎样完成这一系列的测试工作呢&#xff1…

如何修复dxgi.dll文件错误?修复方法推荐

如果您使用Windows操作系统&#xff0c;在使用某些应用程序时&#xff0c;可能会遇到dxgi.dll文件错误。这可能会导致应用程序崩溃或无法正常运行。在本文中&#xff0c;我们将探讨如何修复dxgi.dll文件错误。 一.什么是dxgi.dll文件 dxgi.dll文件是Microsoft DirectX图形接口…

域控制器搭建以及成员加入

需要iso&#xff1a;windows server 2016软件使用&#xff1a;vmwarewindows server 2016系统搭建自己选iso&#xff0c;一直下一步就可以安装完成。&#xff08;记得要设置密码&#xff09;&#xff08;密码要求大小写字母数字符号&#xff09;等待就能安装完成。安装和配置Ac…

day28_js

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 零、 复习昨日 CSS 美化,复用,样式文件和表现文件分离便于维护 选择器 {属性:值;…} 引入css 内联文件内部使用style标签外部文件 <link href"路…

sqoop安装 使用

目录 拷贝安装包 解压 改名 拷贝jar包 修改配置文件 配置环境变量 查看安装情况 查看指定mysql服务器中数据库 查看指定mysql服务器数据库中的表 在hive中创建一个teacher表跟mysql的students中的teacher结构相同 将mysql中students库中的sc数据导出到hdfs指定的文件目…

Spring Cache 介绍及使用方法

目录 一、Spring Cache介绍 1、Spring Cache常用注解 二、Spring Cache使用redis缓存步骤 1、添加依赖 2、添加配置 3、使用注解 一、Spring Cache介绍 Spring cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实…

阿里云EMR集群搭建及使用

目录 1.简介 1.什么是EMR 2.组成 3.与自建hadoop集群对比 4.产品架构 2.使用 1.创建EMR集群 1.登录EMR on ECS控制台 2.软件设置 3.硬件设置 3.基础配置 2.配置 1.组件配置 2.用户管理 3.安全组 4.Gateway 3.组件UI 1.简介 1.什么是EMR EMR是运行在阿里云平台…

国际安全领域顶会NDSS 2023录稿整理 (上)

隐私计算研习社 NDSS是网络和系统安全领域的四大顶级国际学术会议&#xff08;BIG4&#xff09;之一&#xff0c;第三十届会议于2023年2月27日到3月3日&#xff0c;在美国圣迭戈举办。本文将分上下两部分整理会议录取的94篇论文&#xff0c;并对论文进行分类&#xff0c;感兴趣…

【数据库概论】第七章 数据库设计

第七章 数据库设计 7.1 概述 1.数据库设计的基本步骤 数据库设计可以分为以下六个阶段 需求分析阶段 准别了解和分析用户的需求&#xff08;包括数据与处理&#xff09;。需求分析是整个设计过程的基础&#xff0c;觉定了在其上构建数据库的速度和质量。需求分析做不好可能会…

TwinCAT 3 ADS Monitor使用

TwinCAT 3 ADS Monitor使用 《20211022 TwinCAT ADS Monitor的使用方法》 《TwinCAT3.1从入门到精通》 TF6010 | TwinCAT 3 ADS Monitor 以上是基础知识&#xff0c;下面是实操 先在Instance中查看变量的偏移量&#xff0c;即地址 多变量读写测试 结果如下&#xff0c;4条指令…

GPC爬虫池有什么用?

GPC爬虫池有什么用&#xff1f; 答案是&#xff1a;100%提高外贸网站在Google搜索引擎的收录量。 众所周知&#xff0c;要想免费从谷歌搜索引擎获取流量&#xff0c;就好做好谷歌SEO。 一个网站是否能获取谷歌的认可&#xff0c;有一个重要的技术指标&#xff0c;就是这个网…

R语言基础(一):注释、变量

R语言用于统计分析和绘制图表等操作。不同于Java等其它语言&#xff0c;R用于统计&#xff0c;而不是做一个网站或者软件&#xff0c;所以R的一些开发习惯和其它语言不同。如果你是一个编程小白&#xff0c;那么可以放心大胆的学。如果你是一个有编程基础的人&#xff0c;那么需…

数字化时代,你应该知道的BI

我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义&#xff0c;现在市场的数据已经证明商业智能BI在商业世界中&#xff0c;在企业的实践中证明了自己的价值&#xff0c;得到了广泛的认可。 一、什么是BI 有一点可能很多人没有想到&#xff0c;实际上商业智能BI…

CorelDRAW2023详解新增七大功能 ,CorelDRAW2023最新版本更新怎么样?

CorelDRAW2023新功能有哪些&#xff1f;CorelDRAW2023最新版本更新怎么样&#xff1f;让我们带您详细了解&#xff01; CorelDRAW Graphics Suite 2023是矢量制图行业的标杆软件&#xff0c;2023年全新版本为您带来多项新功能和优化改进。本次更新强调易用性&#xff0c;包括更…

如何使用vue创建一个完整的前端项目

搭建Vue项目的完整流程可以分为以下几个步骤&#xff1a;安装Node.js和npm&#xff1a;Vue.js是基于Node.js开发的&#xff0c;因此在开始搭建Vue项目之前&#xff0c;需要先安装Node.js和npm&#xff08;Node.js的包管理器&#xff09;。可以从官网下载Node.js安装包并安装。安…

数据的存储--->【大小端字节序】(Big Endian)(Little Endian)

⛩️博主主页&#xff1a;威化小餅干&#x1f4dd;系列专栏&#xff1a;【C语言】藏宝图&#x1f38f; ✨绳锯⽊断&#xff0c;⽔滴⽯穿&#xff01;一个编程爱好者的学习记录!✨前言计算机硬件有两种存储数据的方式&#xff1a;大端字节序——Big Endian小端字节序——Little …

【Android -- 开源库】表格 SmartTable 的基本使用

介绍 1. 功能 快速配置自动生成表格&#xff1b;自动计算表格宽高&#xff1b;表格列标题组合&#xff1b;表格固定左序列、顶部序列、第一行、列标题、统计行&#xff1b;自动统计&#xff0c;排序&#xff08;自定义统计规则&#xff09;&#xff1b;表格图文、序列号、列标…