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

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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颜色输出

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老秦包你会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值