作者前言

✨✨✨✨✨✨
​ 作者介绍:

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

一个爱分享的小博主 欢迎小可爱们前来借鉴


进度条

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

预备知识

缓冲区
我们在Linux中写一段程序暂停的代码,使用make执行
C文件:

makefile文件

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

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

入门进度条

思路:

每次我们多打印一个字符,下一秒我们就回车,然后打印新的字符串,直到进度条满了

1 #include2 #include3 #include4 #include5 #define MAX 1016 #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"); 2122 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#include#include#include#include#define M 103#define NUM '#'#define NEXT '>'#define FILESIZE 1024*1024*1024typedef void(*FUN)(double);//version 1void process();//version 2 void process1();void rate(double num);

main.c

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

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