文章目录
- 回车与换行
- 缓冲区
- 举个栗子
- fflush函数
- 倒计时小程序
- 进度条小程序
回车与换行
回车和换行是不同的两个概念
回车:\r
使光标回到本行行首。
换行:\n
使光标下移一格。
一般我们的键盘上的Enter键是回加换行键
在c语言中
\n
表示回车+换行 效果和Enter键一样
\r
使光标回到本行行首。
缓冲区
缓冲区buffer: 它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
举个栗子
第一个例子是先打印Hello World 在等待两秒结束程序
第二个例子比第一个例子少一个\n,则是先等待两秒后在打印Hello World
- 这两个例子就可以用来证明缓冲区的存在,在第二个例子中,printf函数肯定先执行,然后再执行sleep函数。
- 但是printf先执行,并不是执行完就打印到显示器上。而是先将打印的内容存放到缓冲区中,等到程序运行结束才打印到显示器中
- 第一个例子是因为当缓冲区中遇到’\n’或是缓冲区被写满就会被打印出来。不会等到程序结束才打印。
fflush函数
刷新缓冲区
在上面第二个例子中除了加\n可以实现 先打印Hello World 再等待两秒结束程序;还可以使用fflush函数刷新缓冲区完成
倒计时小程序
了解了上面的三个概念后可以简单的实现一个倒计时小程序
#include<stdio.h>
#include<unistd.h>
int main()
{
int cout = 9;
while(cout >= 0)
{
printf("%d\r",cout--);
fflush(stdout);
sleep(1);
}
return 0;
}
如果没有fflush函数刷新缓冲区,那么打印的结果会一直存到缓冲区中,程序结束了什么也看不到
进度条小程序
#include<stdio.h>
#include<unistd.h>
#include <string.h>
int main()
{
int i = 0;
char buff[102];
memset(buff,0,sizeof(buff));
while(i <= 100 )
{
printf("[%-100s][%d%%]\r",buff,i);
fflush(stdout);
buff[i++] = '#';
usleep(100000);
}
printf("\n");
return 0;
}