回车和换行符在 linux 系统下的 gcc 编辑器中,是能观测出有明显区别的。
\n
:换行 --> 光标去往下一行的相同位置
\r
:回车 --> 光标回到该行最左侧(两步之和,才是我们平时所理解的,Enter 一下,光标去往第二行的初始位置。
打印至屏幕有几点是需要注意的:
- 凡是向屏幕打印的内容,都是一个一个的字符
- 打印动作会在光标所在位置进行
- 使用printf打印信息的出现顺序:缓冲区->屏幕(
fflush
刷新缓冲区,就是一个将信息从缓冲区提取到屏幕的过程)- 缓冲区自己是有很多刷新策略的,比如 \n 是行缓冲,遇到 \n 就可以把之前的刷新出来
程序结束也会刷新
①
代码:末尾什么都不加,刷新缓冲区,显式查看光标位置
编译输出:光标在该行末尾,停留 3s 后,继而打印命令提示符
推论:fflush
可以 手动刷新缓冲区
②
代码:末尾什么都不加,不主动刷新缓冲区,显式查看光标位置
编译输出结果:光标在行首停留 3s 后,同时打印出结果和命令提示符
推论:程序结束 可以 自动刷新缓冲区
③
代码:打印末尾加 \n 回车,并使其可以显式查看光标位置
编译输出:光标在第二行位置停留 3s 后,继而打印命令提示符
推论:遇到 \n
可以 刷新缓冲区
④
代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置,不刷新缓冲区
编译输出:缓冲区信息未出现,光标直接在空行最开始的位置,停留 3s ,随后该行被命令提示符覆盖
⑤
代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置
编译输出:打印后,光标在该行最开始的位置,停留 3s ,该行被命令提示符覆盖
推论:\r
可以使光标回到最开始
使用如上内容,写一个进度条如下:
① 创建文件包:
② 代码:
main.c
proc.h
proc.c
#include "proc.h"
#include
#include
#define SIZE 52
#define STYLE '='
#define ARR '>'
void process()
{
char *lable = "|/-\\";
char bar[SIZE];
memset(bar,'\0',sizeof(bar));
int i = 0;
while(i <= 50)
{
//printf("[%-50s][%d%%][%c]\r", bar,i*2,lable[i%4]);
printf("\033[0;32;31m[%-50s][%d%%][%c]\033[m\r", bar,i*2,lable[i%4]); // 色彩格式
fflush(stdout);
bar[i++] = STYLE;
if(i != 50) bar[i] = ARR;
usleep(100000); //微秒,1s = 10^6um,这里是0.1s
}
printf("\n");
}
③ 用 Makefile 运行文件包
Makefile
需要用到的命令:
生成可执行文件:make
清除可执行文件:make clean