回车与换行
回车(\r):回到当前行行首
换行(\n):换到当前行下一行行首
缓冲区概念
一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器(内存),或者分段运输区,在这里数据可被存储并在之后用于检索。
缓冲区可分为:全缓冲,行缓冲,不带缓冲
全缓冲:当填满标准IO的缓存后才进行实际IO操作。windows和linux都可以通过给 _Mode设为 _IOFBF设置全缓冲。全缓冲的典型就是对磁盘文件的读写。缓冲区为空,一次读满数据,再写出。
行缓冲:在输入输出遇到换行符时,执行真正的IO操作。linux输出默认是行缓冲,以回车结束。windows没有行缓冲,不能设置,一旦设置变为全缓冲。设置行缓冲为:_IOLBF。这时候输入的字符先存放至缓冲区,等按下回车键时才进行实际IO操作。典型代表就是键盘输入数据,每次读取一行。
不带缓冲:直接进行实际的输入输出操作。windows默认输出不带缓冲,linux可以设置setvbuf(stdout, NULL, _IONBF, 0)。
缓冲区刷新
- 对于输出来说,刷新缓冲区就是让缓冲区内内容立即输出
#include <stdio.h>
#include <unistd.h>
int main(){
printf("hello world!");
sleep(3);
return 0;
}
由于Linux下是行缓冲,所以让它睡眠3秒查看现象,发现hello world!会先输入到缓冲区中,睡眠3秒后输出到显示屏上。
#include <stdio.h>
#include <unistd.h>
int main(){
printf("hello world!");
fflush(stdout);
sleep(3);
return 0;
}
如果刷新缓冲区,则会先将hello world!输出到显示屏,然后休眠3秒。
- 对于输入来说,刷新缓冲区就是将后面的内容抛弃
#include <stdio.h>
int main(){
char c = getchar();
printf("%c\n",c);
c = getchar();
printf("%c\n",c);
c = getchar();
printf("%c\n",c);
return 0;
}
#include <stdio.h>
int main(){
char c = getchar();
printf("%c\n",c);
c = getchar();
printf("%c\n",c);
fflush(stdin);
c = getchar();
printf("%c\n",c);
return 0;
}
彩色进度条
利用回车概念,实现视觉上的彩色进度条。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
char buf[102] = {0};
int i = 0;
int j = 0;
int color[] = {1, 2, 3, 4, 5, 6, 7};
const char* lable = "|/-\\";
for(; i < 101; ++i){
buf[i] = '#';
printf("\033[3%dm[%-101s]\033[0m\033[33m[%d%%]\033[0m[%c]\r", color[j], buf, i, lable[i % 4]);
//每25%换一次颜色
if(i % 25 == 0){
++j;
}
fflush(stdout);
usleep(50000);
}
printf("\n");
return 0;
}
效果如下:
在这里就有一个疑问如何使输出字体带颜色?
经过查找资料发现只有在输出时候加上 ”\033[ ; m …… \033[0m“即可使得输出的字体和背景是有颜色的。
常见参数如下:
字背景颜色范围:40 - 49
- 40:黑
- 41:深红
- 42:绿
- 43:黄色
- 44:蓝色
- 45:紫色
- 46:深绿
- 47:白色
字颜色:30 - 39
- 30:黑
- 31:红
- 32:绿
- 33:黄
- 34:蓝色
- 35:紫色
- 36:深绿
- 37:白色
ANSI控制码:
- \33[0m 关闭所有属性
- \33[1m 设置高亮度
- \33[4m 下划线
- \33[5m 闪烁
- \33[7m 反显
- \33[8m 消隐
- \33[30m – \33[37m 设置前景色
- \33[40m – \33[47m 设置背景色
- \33[nA 光标上移n行
- \33[nB 光标下移n行
- \33[nC 光标右移n行
- \33[nD 光标左移n行
- \33[y;xH设置光标位置
- \33[2J 清屏
- \33[K 清除从光标到行尾的内容
- \33[s 保存光标位置
- \33[u 恢复光标位置
- \33[?25l 隐藏光标
- \33[?25h 显示光标