【Linux】Linux小程序-进度条

目录

        一、\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;
}

运行结果:


 本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 老铁们,记着点赞加关注!!!

猜你喜欢

转载自blog.csdn.net/m0_63198468/article/details/130777825