【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)

1. \r 和 \n

回车和换行符在 linux 系统下的 gcc 编辑器中,是能观测出有明显区别的。

\n:换行 --> 光标去往下一行的相同位置
\r:回车 --> 光标回到该行最左侧

(两步之和,才是我们平时所理解的,Enter 一下,光标去往第二行的初始位置。

2. 通过一个小程序观察现象

打印至屏幕有几点是需要注意的:

  1. 凡是向屏幕打印的内容,都是一个一个的字符
  2. 打印动作会在光标所在位置进行
  3. 使用printf打印信息的出现顺序:缓冲区->屏幕(fflush 刷新缓冲区,就是一个将信息从缓冲区提取到屏幕的过程)
  4. 缓冲区自己是有很多刷新策略的,比如 \n 是行缓冲,遇到 \n 就可以把之前的刷新出来
    程序结束也会刷新


🐎代码:末尾什么都不加,刷新缓冲区,显式查看光标位置
在这里插入图片描述
编译输出:光标在该行末尾,停留 3s 后,继而打印命令提示符
在这里插入图片描述在这里插入图片描述
推论:fflush 可以 手动刷新缓冲区

🐎代码:末尾什么都不加,不主动刷新缓冲区,显式查看光标位置
在这里插入图片描述

编译输出结果:光标在行首停留 3s 后,同时打印出结果和命令提示符
在这里插入图片描述
在这里插入图片描述

推论:程序结束 可以 自动刷新缓冲区


🐎代码:打印末尾加 \n 回车,并使其可以显式查看光标位置在这里插入图片描述

编译输出:光标在第二行位置停留 3s 后,继而打印命令提示符
在这里插入图片描述
在这里插入图片描述
推论:遇到 \n 可以 刷新缓冲区


🐎代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置,不刷新缓冲区
在这里插入图片描述
编译输出:缓冲区信息未出现,光标直接在空行最开始的位置,停留 3s ,随后该行被命令提示符覆盖

在这里插入图片描述
在这里插入图片描述
推论:\r 不能 刷新缓冲区


🐎代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置
在这里插入图片描述
编译输出:打印后,光标在该行最开始的位置,停留 3s ,该行被命令提示符覆盖
在这里插入图片描述
在这里插入图片描述
推论:\r 可以使光标回到最开始


3. 进度条

使用如上内容,写一个进度条如下:

在这里插入图片描述

① 创建文件包:

在这里插入图片描述

🐎② 代码:
main.c

在这里插入图片描述

proc.h

在这里插入图片描述

proc.c

#include "proc.h"
#include<string.h>
#include<unistd.h>

#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

在这里插入图片描述


  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值