1,行缓冲区
先看下面的代码和运行结果,
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("你好\n");
sleep(3);
return 0;
}
只是一个简单的打印“你好”然后休眠三秒,最后程序结束
再看下面的代码和运行结果:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("你好");
sleep(3);
return 0;
}
这串代码中我们把printf里面的 ' \n ' ,去掉了,那么运行结果就不同了,就变成了先休眠三秒,然后再打印的“你好”。该现象证明了,打印的时候,系统和屏幕中间是存在缓冲区的。
显示器对应的是行刷新,就是当缓冲区写满或者代码执行时遇到 ' \n ' 时,才会显示到屏幕上,至于原因我们到IO流部分会详细讲解,目前阶段可以通过“Linux下一切皆文件”的概念把屏幕也看成一个文件。 所以上面的第二个代码是先休眠三秒然后程序结束前把缓冲区数据刷新到屏幕上。
2,\n 与 \r
\n:我们很熟悉,就是换行
\r:这个我们用的不多,它表示使光标回到本行行首
简单来说,我们键盘上的回车键也就是Enter,按下代表 ‘ \n+\r ’。所以 \r代表回到本行行首,那么我们可以简单写一个程序,使运行后在同一个位置打印1 - 10,不换行,覆盖打印,如下代码
#include<stdio.h>
#include<unistd.h>
int main()
{
int i = 1;
for(i = 1; i <= 10; i++)
{
printf("%d\r", i);
fflush(stdout); //ffush表示强制刷新缓冲区,是刷新缓冲器的形式之一,其他刷新缓冲区的策略我们到文件系统再详细展开
sleep(1);
}
return 0;
}
3,进度条代码和展示
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define NUM 102
int main()
{
char bar[NUM];
memset(bar,0,sizeof(bar));
const char* lable="|/-\\"; //进度条后面4个符号
int cnt =0;
while(cnt <= 100)
{
// printf("%s\n",bar);//打印,但是分行打印
printf("[%-100s][%d%%] %c\r",bar,cnt,lable[cnt%4]); //利用\r,实现覆盖打印
bar[cnt++] = '#';
fflush(stdout);
usleep(50000); //以后时间可以根据需求自定义
}
printf("\n"); //换行,防止最后shell的命令提示符信息覆盖掉进度条打印
return 0;
}