目录
一、\r和\n的理解
二、行缓冲区概念
三、进度条源代码
一、\r和\n的理解
\r:回车;
\n:换行;
那么请问这两个有什么区别呢?
比如:我们在编写内容的时候,一行没有写完的情况下,需要换到下一行的开始位置,此时需要两个步骤:
(1)让光标从第一行跳到第二行,但是光标只是垂直向下跳,并没有在第二行的开始。这个操作就是换行(\n)。
(2)在第二行让光标跳到最开始的位置,这个操作就是回车(\r)。
话不多说,我们进行下面的例子,就可以一目了然,
<1>\n和\r都存在
既有回车又有换行,所以执行完命令之后,光标会在下一行的开头。
<2> \n存在
只有换行的时候,我们运行出来和上面第一种情况相同,原因是,在C语言环境下,自动将其简化,此时的\n就表示回车加换行。
<3>\r存在
只有回车,我们可以想象到运行的结果是什么样,答案是:什么都不显示。为什么呢?
- 回车之后,光标来到了文本行的开始位置,此时linux的命令行就会从光标处开始,将我们的文本覆盖掉,我们就什么也看不到。
二、行缓冲区概念
首先先看看下面3段代码的现象:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world!\n");
sleep(3);
return 0;
}
结果:直接打印出hello world!,然后停留3秒之后换行给出新的命令。
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world!");
sleep(3);
return 0;
}
刚开始不显示,停留3秒之后,在一行中显现hello world!和新的命令行。
说明在刚开始运行的时候,数据被存在行缓冲区中的,3秒过后,才刷新出来。
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world!");
fflush(stdout);
sleep(3);
return 0;
}
直接显现hello world!,然后停留3秒之后,在其后面直接给出新的命令行。
三、进度条源代码
(1)proc.h
#pragma once
#include <stdio.h>
void process();
(2)proc.c
void process()
{
const char *lable = "|/-\\";
char bar[SIZE];
memset(bar,0,sizeof(bar));
int i = 0;
while(i<=100)
{
printf("\033[42;32;31m[%-100s\033[0m][%d%%][%c]\r",bar,i,lable[i%4]);
fflush(stdout);
bar[i++]=STYLE;
usleep(100000);
}
printf("\n");
}
(3)main.c
#include "proc.h"
int main()
{
process();
return 0;
}
运行结果:
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。