回车、换行、回车换行
- 回车换行也是有故事的。
- 回车 :
\r
本义是光标重新回到本行行首,r的英文return - 换行:
\n
本义是光标往下一行(不一定到下一行行首),n的英文newline
现在的回车换行:enter
键就是两者的结合。
字符设备
- 显示器显示数字的时候,其实显示的是一个个的字符;printf 把内存里面的数据进行格式化字符;键盘输入字符,scanf 转换成整形,所以键盘,显示器都是字符设备。
缓冲区刷新策略
- 缓冲区本质是一段内存空间,暂存临时数据,在合适的时候刷新出去。
- 刷新:把数据真正的写入磁盘、文件、显示器、网络等设备或文件
- 刷新策略:
- 直接刷新,不缓冲
- 缓冲区写满,再刷新,全缓冲
- 碰到
\n
就刷新,行刷新 - 强制刷新:
fflush(File* pf)
倒计时实现
- 任何一个C程序,启动的时候会打开三个输入输出流文件:
stdin
,stdout
,stderr
;再结合回车\r
,强制刷新即可实现一个倒计时。
进度条
".....\r"
,前面的内容,通过强制刷新,每次都在行首打印。....
设置成[ 字符数组 ][显示%多少进度][旋转竖杠...]
- 数组打印格式:左对齐,宽度占位
%%
:对%d后的%
进行转义[旋转竖杠数组:-|/\\]
:%c打印
;%数组长度,就可实现旋转的效果
- 循环强制刷新休眠,实现动态效果
- 对字符字符数组的下一位设置,
printf
还可以实现颜色输出;还可以结合文件内容输出等等;实现不同动态的效果。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #define NUM 100
5
6 int main()
7 {
8 const char* c1="-|/\\";
9 char bar1[NUM+3];//...
10 memset(bar1,0,sizeof(bar1));
11 int i=0;
12 while(i<NUM+1)
13 {
14 bar1[i]='=';
15 bar1[i+1]='>';//100 101
17 printf("[%-102s][%d%%][%c]\r",bar1,i,c1[i%4]);
20 fflush(stdout); //\r强制刷新缓冲区
21 usleep(100000);//微妙
22 i++;
23 }
24 printf("\n");
25 return 0;
26 }
编者寄语
- 就敲到现在的代码字符量而言,远不到1M…