Linux课程四课---Linux第一个小程序(进度条)

news2024/11/15 13:38:04

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


进度条

  • **作者前言**
  • 预备知识
  • 入门进度条
  • 复杂进度条

预备知识

缓冲区
我们在Linux中写一段程序暂停的代码,使用make执行
C文件:
在这里插入图片描述
makefile文件
在这里插入图片描述
当我们执行make生成可执行文件,并运行的时候,就会发现,程序停留三秒才打印出来,让我们以为该程序是先运行sleep的.其实不是,C语言的顺序结构是从上往下执行代码,
原因:
程序休眠的时候sleep已经跑完,进而得知,代码中输出的字符串被保存了,
因为C对IO函数提供了一个缓冲区,我们如果刷新缓冲区(在字符串后面添加\n)或者程序结束就会打印字符串出来.
fflush(stdout):也是刷新缓冲区

回车与换行
在我们的经常使用回车键的时候是往下一行,然后光标移动到下一行的开始,(包含了回车和换行)其实真正的换行只是换行,光标没有移动到下一行的开始,,回车就是光标移动到当前行的开始
在C语言中, "\r"表示回车
在这里插入图片描述

入门进度条

思路:
在这里插入图片描述
每次我们多打印一个字符,下一秒我们就回车,然后打印新的字符串,直到进度条满了

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #define MAX 101
  6 #define LABLE '='
  7 
  8 int main()
  9 {
 10   char bar[MAX];
 11   memset(bar, '\0',sizeof(bar));
 12   int i = 0;
 13   for(i = 0; i < MAX - 1; i++)
 14   {
 15     printf("%s\r", bar);
 16     fflush(stdout);
 17     usleep(100000);                                                                                                                                                                                           
 18     bar[i] = LABLE;
 19   }
 20   printf("\n");
 21 
 22   return 0;//程序结束:
 23 }

在这里插入图片描述

复杂进度条

我们要想在linux中写一个进度条,使用到的知识就是make这个指令,
首先我们先创建四个文件, Test.h 、Test.c 、main.c, makefile.头文件用来声明, Test.c用来定义函数,
main.c文件用来汇总, makefile文件里面写入执行代码
makefile文件:
在这里插入图片描述
需要注意的是,我们生成 一个总的可执行文件main, 必须先生成Test,c和Test.c的二进制文件,然后链接成一个总的可执行文件,如果只生成其中一个执行文件,就会报错
Test.c

#include"Test.h"
const char* strs="\\-|/";
void process()
{
  char buffer[M];
  memset(buffer,'\0', sizeof(buffer));
  int i = 0;
  int size = strlen(strs);
  for(i = 0; i <= 100; i++)
  {
    if(i < 100)
      buffer[i] = NEXT;
    printf("[%-100s][%3d%%][%c]\r", buffer, i, strs[i%size]);
    fflush(stdout);
    buffer[i]=NUM;
    usleep(100000);
  }
}
//复杂的进度条
void process1()
{
  int total = FILESIZE; 
  srand(time(NULL)^1023);
  while(total)
  {

     int one = rand()%(1024*1024*10);
     total -= one;
     if(total < 0)
       total = 0;
     int num = FILESIZE - total;
     double date = (num*1.0 / (FILESIZE))*100.0;
     //usleep(100000);
     //printf("%lf\n", date);
     rate(date);
  }

}
char buffer[M] = {0};
void rate(double num)
{
  int d = num;
  int size = strlen(strs);
  static int cnt = 0;
  cnt = d;
  if(d == 0)
    buffer[0]=NEXT;
  printf("[%-100s][%3d%%][%c]\r", buffer, d, strs[cnt%size]);
  fflush(stdout);
  buffer[cnt++]=NUM;
  if(cnt < 100)
    buffer[cnt] = NEXT;
  usleep(100000);
 if(d == 100)
   printf("\n");
}

Test.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<time.h>
#define M 103
#define NUM '#'
#define NEXT '>'
#define FILESIZE 1024*1024*1024
typedef void(*FUN)(double);
//version 1
void process();

//version 2
 void process1();
void rate(double num);

main.c

**#include"Test.h"
int main()
{
  //process();
  process1();

  return 0;
}**

如果想要给进度条有颜色可以去网上查找相关 的 C语言的printf颜色输出

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

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

相关文章

Windows影子账户

Windows影子账户 先检查administrator账户有没有被禁用&#xff0c;如果administrator账户被禁用 所属组内的账户都会被禁用&#xff0c;导致影子账户无法登录 创建隐藏用户 加入管理员组 隐藏用户创建方法&#xff1a; net user 用户名$ 密码 /add 输入 regedit打开注册表…

微信小程序简单实现手势左右滑动和点击滑动步骤条功能

使用微信小程序实现左右滑动功能&#xff0c;自定义顶部图案&#xff0c;点击文字滑动和手势触屏滑动&#xff0c;功能简单&#xff0c;具体实现代码如下所示&#xff1a; 1、wxss代码&#xff1a; /* 步骤条 */ .tab-box {display: flex;flex-direction: row;position: fix…

springboot整合springsecurity,从数据库中认证

概述&#xff1a;springsecurity这个东西太容易忘了&#xff0c;这里写点东西&#xff0c;避免忘掉 目录 第一步&#xff1a;引入依赖 第二步&#xff1a;创建user表 第三步&#xff1a;创建一个用户实体类&#xff08;User&#xff09;和一个用于访问用户数据的Repository…

Midjourney 和 Dall-E 的优劣势比较

Midjourney 和 Dall-E 的优劣势比较 Midjourney 和 Dall-E 都是强大的 AI 绘画工具&#xff0c;可以根据文本描述生成图像。 它们都使用深度学习模型来理解文本并将其转换为图像。 但是&#xff0c;它们在功能、可用性和成本方面存在一些差异。 Midjourney 优势: 可以生成更…

yocto编译测试

源码下载 git clone -b gatesgarth git://git.yoctoproject.org/poky lkmaolkmao-virtual-machine:~/yocto$ git clone -b gatesgarth git://git.yoctoproject.org/poky Cloning into poky... remote: Enumerating objects: 640690, done. remote: Counting objects: 100% (13…

【漏洞复现】CVE-2004-2761:使用弱哈希算法签名的 SSL 证书(SSL Certificate Signed Using Weak Hashing Algorithm)

概要&#xff1a;本次复现是针对编号为CVE-2004-2761的漏洞&#xff0c;由于条件有限&#xff0c;本次复现通过创建自签名证书进行操作。 问题描述&#xff1a;证书链中的 SSL 证书使用弱哈希算法进行签名。 1 环境搭建 本次复现环境在Linux平台下使用Nginx进行环境的搭建&…

ModbusTCP转Profinet网关高低字节交换切换

背景&#xff1a;在现场设备与设备通迅之间通常涉及到从一种字节序&#xff08;大端或小端&#xff09;转换到另一种字节序。大端字节序是指高位字节存储在高地址处&#xff0c;而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…

Java安装及环境配置详细教程

1.1 下载 Java 安装包 官网下载链接[点击跳转] 建议下载202版本&#xff0c;因为202版本之后的 Oracle JDK 是商用收费的&#xff08;个人使用不收费&#xff09; 1.2 勾选红框中内容&#xff0c;然后点击下方下载 1.3 如果没有登录 Oracle 则会跳转到该页面&#xff0c;因为…

爬虫 Day2

resp.close()#关掉resp 一requests入门 &#xff08;一&#xff09; 用到的网页&#xff1a;豆瓣电影分类排行榜 - 喜剧片 import requestsurl "https://movie.douban.com/j/chart/top_list" #参数太长&#xff0c;重新封装参数 param {"type": "…

Python环境下基于机器学习(决策树,随机森林,KNN和SVM)的轴承故障诊断

故障特征提取就是从振动信号中提取时、频域统计特征&#xff0c;并利用能量值、谱峭度、幅值等指标&#xff0c;提取出故障特征集。对故障特征值进行全面准确地提取&#xff0c;是提高诊断精度的关键&#xff0c;也是整个滚动轴承故障诊断过程中较困难的部分。 一些常见的时域…

Redis 过期删除策略和内存淘汰策略有什么区别?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) Redis 的「内存淘汰策略」和「过期删除策略」&#xff0c;很多小伙伴容易混淆&#xff0c;这两个机制虽然都是做删除的操作&#xff0c;但是触发的条件和使用的策略都是不同的。 今天就跟大家理一理&…

如何将OpenCV Java 与Eclipse结合使用

返回目录&#xff1a;OpenCV系列文章目录 上一篇&#xff1a;OpenCV-Java 开发简介 下一篇&#xff1a; 正文&#xff1a; 警告&#xff1a;本教程可以包含过时的信息。 从 2.4.4 版本开始&#xff0c;OpenCV 支持 Java。在本教程中&#xff0c;我将解释如何设置开发环境&a…

信息系统项目管理师019:存储和数据库(2信息技术发展—2.1信息技术及其发展—2.1.3存储和数据库)

文章目录 2.1.3 存储和数据库1.存储技术2.数据结构模型3.常用数据库类型4.数据仓库 记忆要点总结 2.1.3 存储和数据库 1.存储技术 存储分类根据服务器类型分为&#xff1a;封闭系统的存储和开放系统的存储。封闭系统主要指大型机等服务器。开放系统指基于包括麒麟、欧拉、UNIX…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者&#xff1a;ajun 随着文档处理需求的增加&#xff0c;格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性&#xff0c;将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件&#xff0c;提供了这样的转换功…

Verilog——信号类型

Verilog HDL 的信号类型有很多种&#xff0c;主要包括两种数据类型&#xff1a;线网类型 (net type) 和寄存器类型 &#xff08; reg type &#xff09;。在进行工程设计的过程中也只会使用到这两个类型的信号。 4.1 信号位宽 定义信号类型的同时&#xff0c;必须定义好信号…

【C#语言入门】22. 接口、依赖反转、单元测试

【C#语言入门】22. 接口、依赖反转、单元测试 一、接口与单元测试 接口的产生&#xff1a;自底向上&#xff08;重构&#xff09;&#xff0c;自顶向下&#xff08;设计&#xff09;C#中接口的实现&#xff08;隐式&#xff0c;显式&#xff0c;多接口&#xff09;语言对面向…

java的成员变量和局部变量

1、什么是成员变量和局部变量&#xff1f; 2、成员变量和局部变量区别 区别 成员变量 局部变量 类中位置不同 类中方法外 方法内或者方法声明上 内存中位置不同 堆内存 栈内存 生命周期不同 随着对象的存在而存在&#xff0c;随着对象的消失而消失 随着方法的调用而…

【目标检测】YOLOv2 网络结构(darknet-19 作为 backbone)

上一篇文章主要是写了一些 YOLOv1 的原版网络结构&#xff0c;这篇文章一样&#xff0c;目标是还原论文中原版的 YOLOv2 的网络结构&#xff0c;而不是后续各种魔改的版本。 YOLOv2 和 YOLOv1 不一样&#xff0c;开始使用 Darknet-19 来作为 backbone 了。论文中给出了 Darkne…

RK3568平台 多点触摸电容屏

一.input事件 对于所有的input设备&#xff0c;报告input事件时候都分这么几部分&#xff0c;首先在probe函数中设置设备发送的事件类型、按键类型&#xff0c;设置设备一些属性信息。然后在发送事件时候要根据probe的设置来发送事件&#xff0c;否则就会被判为无效忽略掉。  …

冒泡与二分法的爱恨纠葛

冒泡排序与二分法查找 前言一、冒泡排序&#xff1f;二分法查找&#xff1f;二、冒泡排序的原理及使用1.原理2.手写冒泡排序思路及实现代码讲解效果演示/运行结果 三、二分法查找的原理及使用1.原理2.二分法查找思路及实现运行结果 总结 前言 冒泡排序&#xff0c;编程中&…