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