【Linux】2.4 第一个小程序——进度条(C语言)

news2024/10/6 6:03:22

文章目录

  • character
    • 缓冲区的问题:
      • ps. sleep 函数
  • 倒计时
  • 进度条
    • 1.打印进度条
    • 2.让进度条“动起来”
    • 3.预留进度条的位置并用提示符显示进度条的状态
    • 4.颜色打印
      • 只用颜色来表示进度条

character

在这里插入图片描述

  • 回车 与 换行

键盘上的 Enter 键:
在这里插入图片描述

换行的过程:
在这里插入图片描述

\r:回车
\n:换行+回车

缓冲区的问题:

  • 〖文件 test1.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Hello RoundBottle!\n");
  sleep(1);
  return 0;
}

test1.c 编译后的执行结果:
在这里插入图片描述
上述代码分析:\n换行符被执行后 缓冲区被刷新 ,显示器上打印——Hello RoundBottle!\n,然后执行 sleep 函数,延时一秒后,显示器上从光标所在位置打印操作提示符。

ps. sleep 函数

头文件:#include <unistd.h>
在这里插入图片描述

  • 〖文件 test2.c〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Hello RoundBottle!\r");
  fflush(stdout);
  sleep(1);
  return 0;
}

test2.c 编译后的执行结果:
在这里插入图片描述

  • 为什么会产生这样的结果? 👆
    在这里插入图片描述

对于要打印到显示器的内容,该内容先会被放入缓冲区当缓冲区被刷新,要打印的内容被从缓冲区拿出来才能被打印在显示器上fflush 可以主动刷新缓冲区;程序进程结束,缓冲区会被自动刷新,然后这个内容会快速的被 接下来要打印到显示器上的操作提示符 给覆盖。

程序进程结束,缓冲区自动刷新如下示例:

  • 〖文件 test3.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Helle RounBottle!");
  sleep(1);
  return 0;
}

test3.c 编译后的执行结果:
在这里插入图片描述
上述代码分析:执行完 sleep 延时函数之后,程序进程结束,缓冲区被刷新,要打印的内容被打印到显示器上,紧接着打印操作提示符。


倒计时

根据上述内容,我们可以根据这个特性写一个“倒计时”:

  1. 从 9 → 0 的倒计时
#include <stdio.h>
#include <unistd.h>
int main()
{
  int i=9;
  while(i>=0)
  {
    printf("%d\r",i);
    fflush(stdout);
    sleep(1);
    i--;
  }

  return 0;
}

运行结果:
在这里插入图片描述

  1. 从 10 → 0 的倒计时
#include<stdio.h>
#include<unistd.h>

int main()
{
  int i=10;
  while(i>=0)
  {
    printf("%2d\r",i);
    fflush(stdout);
    sleep(1);
    i--;
  }
  printf("\n");
  return 0;
}

注意:凡是向显示器打印所有的内容都是字符!例如 printf("%d",123)实际上是在显示器上打印了‘1’‘2’‘3’字符,如果打印 10 ,光标回到开头再打印 9,就会变成——90,依此类推,如下所示:
在这里插入图片描述
所以,更好的打印方式:printf("%2d\r",i);

从10开始的倒计时运行结果:
在这里插入图片描述


进度条

要求:[ 用符号显示进度 ] [进度百分比]
示例:
在这里插入图片描述
同样的,.h文件包含需要的头文件并声明函数,.c文件中定义函数

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc.h
#pragma once

#include<stdio.h>
#include<unistd.h>
#include <string.h>
void process();
[RoundBottle@VM-12-2-centos Progressbar]$ cat main.c
#include "proc.h"

int main()
{
  process();

  return 0;
}

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc1.c
#include "proc.h"

#define MARK '#'
#define NUM 100


void process()
{
  int i=0;
  char str[NUM]={0};
  memset(str,'\0',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%]\n",str,i);
  }
}
  • 同样的,我们写一个 Makefile 的文件,通过 make 指令来对文件进行编译,关于此部分的详见文章👉【Linux】2.3 编译器—gcc/g++ && 项目自动化构建工具—make/Makefile

  • 关于 memset函数简单理解的用法memset(一个地址,这个地址所指向的空间要被写入 什么内容 ,从这个地址包括这个地址所指向的空间往后写 多少个 )(详见cplusplus.com:memset)

1.打印进度条

  • pb1:
[RoundBottle@VM-12-2-centos Progressbar]$ ./pb1
[][0%]
[#][1%]
[##][2%]
[###][3%]
[####][4%]
[#####][5%]
[######][6%]
[#######][7%]
[########][8%]
[#########][9%]
[##########][10%]
[###########][11%]
[############][12%]
[#############][13%]
[##############][14%]
[###############][15%]
[################][16%]
[#################][17%]
[##################][18%]
[###################][19%]
[####################][20%]
[#####################][21%]
[######################][22%]
[#######################][23%]
[########################][24%]
[#########################][25%]
[##########################][26%]
[###########################][27%]
[############################][28%]
[#############################][29%]
[##############################][30%]
[###############################][31%]
[################################][32%]
[#################################][33%]
[##################################][34%]
[###################################][35%]
[####################################][36%]
[#####################################][37%]
[######################################][38%]
[#######################################][39%]
[########################################][40%]
[#########################################][41%]
[##########################################][42%]
[###########################################][43%]
[############################################][44%]
[#############################################][45%]
[##############################################][46%]
[###############################################][47%]
[################################################][48%]
[#################################################][49%]
[##################################################][50%]
[###################################################][51%]
[####################################################][52%]
[#####################################################][53%]
[######################################################][54%]
[#######################################################][55%]
[########################################################][56%]
[#########################################################][57%]
[##########################################################][58%]
[###########################################################][59%]
[############################################################][60%]
[#############################################################][61%]
[##############################################################][62%]
[###############################################################][63%]
[################################################################][64%]
[#################################################################][65%]
[##################################################################][66%]
[###################################################################][67%]
[####################################################################][68%]
[#####################################################################][69%]
[######################################################################][70%]
[#######################################################################][71%]
[########################################################################][72%]
[#########################################################################][73%]
[##########################################################################][74%]
[###########################################################################][75%]
[############################################################################][76%]
[#############################################################################][77%]
[##############################################################################][78%]
[###############################################################################][79%]
[################################################################################][80%]
[#################################################################################][81%]
[##################################################################################][82%]
[###################################################################################][83%]
[####################################################################################][84%]
[#####################################################################################][85%]
[######################################################################################][86%]
[#######################################################################################][87%]
[########################################################################################][88%]
[#########################################################################################][89%]
[##########################################################################################][90%]
[###########################################################################################][91%]
[############################################################################################][92%]
[#############################################################################################][93%]
[##############################################################################################][94%]
[###############################################################################################][95%]
[################################################################################################][96%]
[#################################################################################################][97%]
[##################################################################################################][98%]
[###################################################################################################][99%]
[####################################################################################################][100%]

2.让进度条“动起来”

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc2.c
#include "proc.h"

#define MARK '#'
#define NUM 100

void process()
{
  int i=0;
  char str[NUM]={0};
  memset(str,'\0',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%]\r",str,i); //输出一次进度条后让光标回到一行开头的位置
    fflush(stdout); //刷新缓冲区,将要打印的内容打印到显示器上

    usleep(100000);
  }
  printf("\n");
}
  • \r:回车——使得光标回到行首的位置
  • usleep函数:(ps. microsecond—微秒; 1 微秒 = 10-6s
    在这里插入图片描述
  • 注:循环结束printf("\n");是为了——最后进度条完成进度之后,不被接下来要打印在显示器上的操作提示符给覆盖。

运行结果:
在这里插入图片描述

3.预留进度条的位置并用提示符显示进度条的状态

预留进度条的位置——初始化进度条的内容为空格。

因为进度加载的过程中可能卡住,所以我们需要一个符号来显示进度条的状态——正在加载/加载已经终止/进度加载完成

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc3.c
#include "proc.h"

#define MARK '#'
#define NUM 100


void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    printf("[%s][%d%%][%c]\r",str,i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

运行结果:
在这里插入图片描述

4.颜色打印

  • 格式:\033[字背景颜色;字体颜色m字符串\033[0m

(这里进度条的样式换了另外的符号表示,这个不重要,看自己需求选择)

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc4.c
#include "proc.h"

#define MARK '-'
#define NUM 100

void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    memset(str,MARK,i);
    if(i!=NUM)
    {
      str[i]='>';
    }
    printf("\033[40;44m[%s]\033[0m[%3d%%][%c]\r",str,i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

注意:这里的 i和数组下标是不对应的!
在这里插入图片描述

运行结果:
在这里插入图片描述

只用颜色来表示进度条

[RoundBottle@VM-12-2-centos Progressbar]$ cat proc5.c
#include "proc.h"

#define NUM 100

void process()
{
  int i=0;
  char symbol[]={'|','/','-','\\','\0'};
  char str[NUM]={0};
  memset(str,' ',NUM);
  for(;i<=NUM;++i)
  {
    int num=i;
    while(num--)
    {
      printf("\033[44;37m%c\033[0m",str[num]);
    }
    printf("[%3d%%][%c]\r",i,symbol[i%4]);
    fflush(stdout);

    usleep(100000);
  }
  printf("\n");
}

运行结果:
在这里插入图片描述


END

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

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

相关文章

程序员如何成为一名独立开发者?

这里有一个最简单粗暴的方式让你确定你是否能成为一个独立的开发者。 Lv.1 顺畅地完成一个独立外包项目 一个最低成本的试错方式就是去独立地完成一个外包项目&#xff0c;一般来说外包项目的难度较低&#xff0c;但也具有作为开发者必备的大多数流程&#xff0c;如果不确定自…

ChatGPT+小红书爆文,牛!

随着AI技术的不断发展&#xff0c;它已经逐渐渗透到了我们的生活之中&#xff0c;包括内容营销领域。 我们通过AI算法生成文本、优化搜索引擎排名、提高用户体验等&#xff0c;现在AI已逐渐在改变时代的进步&#xff0c;AI也将成为下一个十年的一个变革。我们每个创业者、内容…

Go的开发工具

Go的开发工具 1.VSCode 开源地址: GitHub - microsoft/vscode: Visual Studio Code 官网&#xff1a;https://code.visualstudio.com 好处是免费的&#xff0c;插件多&#xff01;&#xff01;&#xff01; 2.GoLand 收费&#xff0c;是和IDEA是类似的&#xff0c;非常强。…

零基础转行从事云计算运维工作,不得不掌握的几项技能

转行云计算运维已成为今年热门话题之一&#xff0c;面对内卷严重的Java领域&#xff0c;虽然高薪有前景&#xff0c;但是很多人都是望而止步&#xff0c;自己的实力不允许自己卷入这场“高薪职业争夺战”。于是新的IT热门转行职业云计算被重点关注&#xff0c;它会不会成为下一…

如何使用SCQA模型提高表达能力

SCQA架构是“结构化表达”工具。 一、什么是“SCQA架构”&#xff1f;‍ S&#xff08;Situation&#xff09;情景——由熟悉的情境或事实引入 C&#xff08;Complication&#xff09;冲突——指出实际面临的困境或冲突 Q&#xff08;Question&#xff09;疑问——你如何分析…

【开发日志】2023.05 NormalMap Back To Sphere

【开发日志】2023.03.04 ZENO----SimpleGeometry----CreateSphere_EndlessDaydream的博客-CSDN博客CreateSpherehttps://blog.csdn.net/Angelloveyatou/article/details/129178914(4条消息) 【开发日志】2023.04 ZENO----Composite----CompNormalMap_EndlessDaydream的博客-CSD…

Linux-CentOS7安装Oracle11g 11.2.0.1.0

CentOS7安装Oracle11g 下载yum包更新RPM包解压安装包至tmp目录关闭selinux关闭防火墙创建Oracle用户修改内核配置文件创建安装目录和设置文件权限设置环境变量编辑静默安装响应文件安装打开一个新终端使用root用户登录启动监听建立数据库进程查询查看监听状态sqlplus登录设置开…

pgzero所有知识点详解

目录 什么是pgzero&#xff1f; pgzero的安装 4&#xff0c;正式开始&#xff01; 1&#xff0c;调整背景色 2&#xff0c;导入角色 3&#xff0c;鼠标事件 5&#xff0c;按键事件 6&#xff0c;刷新功能 1&#xff0c;角色属性 2&#xff0c;功能介绍 7&#xff0c;…

Java面试 异常

文章目录 1. Java 异常类层次结构概览图2. Exception 和 Error 有什么区别&#xff1f;3. Checked Exception 和 Unchecked Exception 有什么区别&#xff1f;4. Throwable 类常用方法有哪些&#xff1f;5. try-catch-finally 如何使用&#xff1f;6. finally 中的代码一定会执…

chatGPT VS 科大讯飞星火大模型 使用初体验,到底谁更胜一筹?

下午这会有时间&#xff0c;正好之前申请了讯飞星火大模型的体验&#xff0c;这里就想着简单使用体验对比一下chatGPT和星火大模型的差异&#xff0c;废话不多说这里直接上图&#xff1a; 【诺特兰德叶黄素与纯天然蔬菜中的叶黄素有什么区别】 【今年六月份我就要参加高考了&am…

Python实战案例03

文章目录 1、归并排序2、角谷猜想3、兔子数列4、学生管理系统5、饮品自动售货机6、信息安全策略——文件备份7、用户账户管理1、归并排序 先将待排序的序列划分成若干长度为 1 的子序列,依次将两个子序列排序后合并成长度为 2 的子序列;再依次将两个子序列排序后合并成长度为…

基于Yolov8的道路缺陷检测,加入PConv、WIOU 、DCNV2提升检测精度

1.数据集介绍 缺陷类型:crack 数据集数量:195张 1.1数据增强,扩充数据集 通过medianBlur、GaussianBlur、Blur3倍扩充得到780张图片 按照train、val、test进行8:1:1进行划分 1.1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt # coding:utf-8import…

事件轮询EventLoop

JS 是一门单线程语言 (换句话说: 一个时间内我只能做一件事), 异步操作都是放到事件循环队列中, 等待主执行栈来执行 JS 是如何执行的 (执行顺序) ●从上往下, 一行一行执行 ●如果中间的某一行书写有误, 那么程序在运行到这一行会报错并停止向下继续运行 ●先把所有的同步代码…

15个对Web开发人员有用工具网站

1. 代码转图片 网址&#xff1a;https://carbon.now.sh/ 使用 Carbon 创建和分享源代码的精美图像。它提供了多种代码风格和主题。 3.图片图库 网址&#xff1a;https://unsplash.com/ 4. 智能 WebP、PNG 和 JPEG 图片压缩 网址&#xff1a;https://tinypng.com/ tiny…

SpringCloud00

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

VSAN 7 安装部署指南(一)

本文使用三台服务器安装ESXI 7.0 &#xff0c;并在其中一台ESXI中安装vCenter 7.0。本环境中最终在VMware Workstation虚拟机中做的嵌套虚拟化。每台虚拟机配置两块网卡&#xff0c;一块网卡桥接&#xff0c;一块NAT。三块硬盘&#xff0c;一块100GB作为系统盘&#xff0c;一块…

C++前序遍历(栈)

#include <stdio.h> #include <malloc.h> //树结构 typedef struct kl { int data; struct kl *lchild; struct kl *rchild; }bittree; //栈结构 typedef struct ji { int top; bittree **data; int size; }stack; //初始化栈 void in…

【PCIE体系结构十】链路两端的参考时钟有频偏怎么办?

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 PCIE规范中…

Linux环境基础开发工具

目录 Linux软件包管理器yum Linux开发工具 文本编辑器vi、vim vim的基本概念 vim操作 Linux编译器-gcc\g使用 函数库分为动态库和静态库 Linux调试器gdb使用 在gdb模式下的命令 Linux软件包管理器yum yum怎么说呢&#xff1f;就相当我们手机里的应用商店。我们需要安…

RAID磁盘阵列(看咱这篇就够了!)

目录 一、RAID简介 二、RAID的级别详列 三、总结 前言&#xff1a; 写这篇博客的原因是小编在工作中遇到的这个不熟悉的硬件知识&#xff0c;然后工作之余就立马搜集了资料进行学习。了解了RAID的作用和区别以及如何进行挂载之类的。本篇以及之后的一篇博客适合新手小白来初…