作者前言
🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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 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");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 2void process1();
void rate(double num);
main.c
**#include"Test.h"
int main()
{//process();process1();return 0;
}**
如果想要给进度条有颜色可以去网上查找相关 的 C语言的printf颜色输出