缓冲区
缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
所以对于下面的程序:
程序会先休眠5秒,然后打印字符串hello之后结束运行。
这是因为在执行printf时,字符串hello被写入到了C程序的缓冲区中,但并没有输出到显示器上,执行完sleep后,缓冲区中的内容才被刷新到显示器上。
缓冲区的刷新策略为:行刷新、程序结束、强制刷新。
上面这种情况属于程序结束时刷新,如果给printf时加上\n
则属于行刷新:
行刷新就会先把hello刷新到显示器上,然后再休眠5秒。
强制刷新则可使用函数fflush(stdout)
。
C语言程序中,在默认情况下会打开三个文件(也可以叫作三个设备):FILE*stdin
(标准输入),FILE*stdout
(标准输出),FILE*stderr
(标准错误)
默认打开这三个文件是为了让使用者和程序更好的交互,如果不输出到显示器上使用者根本就不知道这个程序是什么情况。
回车\r和换行\n
\r
: 回车,使光标回到本行行首。
\n
: 换行,使光标下移一格。
而我们键盘上的Enter键实际上就等价于\n+\r
。
VS中的\n
也等价于\n+\r
通过回车符就可以实现简易的进度条:
#include<stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\\";
while(i <= 100 ){
printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
printf("\n");
return 0;
}
这里的usleep单位是微秒(千分之一毫秒),sleep单位是秒。