一、预备知识
- 换行和回车的区别
- \r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖,如果之前的内容比下一次来的的内容长,就不会被完全覆盖
- \n:换行,换到当前位置的下一行,而不会回到行首
#include <stdio.h>
#include <unistd.h>
int main()
{
//printf("hello\n");
printf("hello");
sleep(5);
return 0;
}
printf已经执行,但是数据没有被立即刷新到显示器中,没有遇到\n字符串会暂时保存在用户C语言级别的缓冲区,然后再由缓冲区刷新到显示器中,如果一直未遇到就直到程序结束才会被刷新出来
显示器设备刷新策略就是行刷新,即遇到\n即进行刷新
C程序默认会打开三个输入输出流:
stdin,stdout,stderr
键盘 显示器 显示器
可以使用头文件 unistd.h 下的 fflush 来刷新输出缓冲区 stdout
#include <stdio.h>
#include <unistd.h>
int main()
{
//printf("hello\n");
printf("hello");
fflush(stdout); //刷新输出缓冲区
sleep(5);
return 0;
}
二、简单的倒计时
#include <stdio.h>
#include <unistd.h>
int main()
{
int count = 20;
while (count)
{
printf("%2d\r", count); //因为一共是两个字符,所以需要预留出两个字符的位置
fflush(stdout);
count--;
sleep(1);
}
return 0;
}
三、实现
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define NUM 100
int main()
{
char bar[NUM + 1];
memset(bar, '\0', sizeof(bar));
const char* label = "|/-\\";
int i = 0;
while (i <= NUM)
{
printf("[%-100s][%3d%%] %c\r", bar, i, label[i % 4]);
fflush(stdout);
bar[i] = '#';
usleep(50000);
i++;
}
printf("\n");
return 0;
}