目录
一、回车和换行
我们在实现进度条之前先来谈谈两个概念,回车和换行,通常对于我们来说好像回车和换行是一样的,都是走到下一行的最左边,其实它们是不一样的。
回车(\r)是光标回到本行最左侧。
换行(\n)是换到一下一行,光标不一定在最左侧,
二、缓冲区
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello world\n");
sleep(2);
return;
}
对于上面的代码毫无疑问是会先打印hello world然后再sleep两秒。那么下面的代码呢?
#include<stdio.h>
int main()
{
printf("hello world");
sleep(2);
return;
}
对于这段代码呢?这段代码在Linux中,会先sleep两秒然后再打印hello world,我们知道C语言中代码是从主函数依次执行的,也就是说在sleep期间,printf一定执行完了,那么问题来了,在sleep期间hello world在哪里呢?它肯定在,因为我们最后会看到确实打印出来了,所以它一定被保存起来了,那么它被保存在哪里呢?它被保存在C语言提供的缓冲区里面,默认程序退出了缓冲区里的内容才会被刷新出来。上面那段代码是因为有\n,有\n就会刷新,因为显示器是行刷新。
那么如果我们要强制刷新呢?需要用fflush(stdout),它可以将缓冲区里面的内容强制刷新出来。它的文件名是#include<unistd.h>,stdout是标准输出,也就是显示器。
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello world");
fflush(stdout);
sleep(2);
return;
}
三、进度条实现思路:
我们要实现的进度条是从左往右走的,并且还要告诉我们当前的进度,最好还能有一个指针在转圈,所以我们可以用一个数组,第一次往数组里面放一个字符,然后打印,就打印出一个字符,然后继续往数组里面放字符,第二次打印从头开始打印,就相当于把上一次的第一个覆盖了,这样循环一百次,就可以打印出一个进度条。
四、进度条代码实现
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define STYLE '='
const char* lable = "|/-\\";
void processbar()
{
char buff[102] ;
memset(buff,'\0',sizeof(buff));//全部初始化为0
int len = strlen(lable);
int cnt = 0;
while(cnt <= 100)
{
printf("[%-100s][%d%%][%c]\r",buff,cnt,lable[cnt%len]);// /r光标回到最左侧
fflush(stdout); //C语言默认按行刷新,因此需要强制刷新。
buff[cnt++] = STYLE;
if(cnt < 100)
buff[cnt] = '>';
usleep(100000);//usleep是按微秒计算,
}
printf("\n");
}
int main()
{
processbar();
return 0;
}
我们先开一个数组,有101有效字符加上/0,所以我们大小开102,并且把它全部初始化为0,然后用一个循环,循环101次,每进去一次就打印一次数组,打印的时候要回车\r,让光标回到最左侧,不能\n,否则就不在一行上了,然后我们让cnt的位置填上字符,每一次数组里面的有效字符都会比上一次多一个,因此就会不断往后走,注意要打印百分号需要%%,转动的图标,可以用|/-\\,不断打印每一个字符就会有转动的效果。