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

目录

  • 1. \r 和 \n
  • 2. 通过一个小程序观察现象
  • 3. 进度条

1. \r 和 \n

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

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

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

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

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

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


代码:末尾什么都不加,刷新缓冲区,显式查看光标位置
【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第1张图片
编译输出:光标在该行末尾,停留 3s 后,继而打印命令提示符
在这里插入图片描述在这里插入图片描述
推论:fflush 可以 手动刷新缓冲区

代码:末尾什么都不加,不主动刷新缓冲区,显式查看光标位置
【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第2张图片

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

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


代码:打印末尾加 \n 回车,并使其可以显式查看光标位置【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第3张图片

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


代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置,不刷新缓冲区
【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第4张图片
编译输出:缓冲区信息未出现,光标直接在空行最开始的位置,停留 3s ,随后该行被命令提示符覆盖

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


代码:打印末尾加 \r 回车(回到行开头),并使其可以显式查看光标位置
【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第5张图片
编译输出:打印后,光标在该行最开始的位置,停留 3s ,该行被命令提示符覆盖
在这里插入图片描述
在这里插入图片描述
推论:\r 可以使光标回到最开始


3. 进度条

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

在这里插入图片描述

① 创建文件包:

在这里插入图片描述

② 代码:
main.c

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

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

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

需要用到的命令:

生成可执行文件:make

【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)_第8张图片
执行可执行文件:./可执行文件名

清除可执行文件:make clean

在这里插入图片描述


你可能感兴趣的:(Linux,linux,r语言,运维)