Linux小程序-进度条

换行&&回车区别

·回车概念

回到当前行的最开始
·换行概念

列不变,新起一行

'\n':表示的就是回车+换行

'\r':表示的是只回车不换行

行缓冲区概念

以下代码什么现象?

[yyh@ecs-86081 probar]$ cat mycode.c
#include
#include

int main()
{
  printf("hello world\n");

  sleep(5);
  return 0;
}

有\n时,printf的内容会立即打印到显示器上,然后sleep休眠五秒。这个例子也就说明了\n具有刷新缓冲区的作用。

以下代码什么现象?

hello world[yyh@ecs-86081 probar]$ cat mycode.c
#include
#include

int main()
{

  printf("hello world");

  sleep(5);
  return 0;
}

当没有\n时,printf里面的内容不会立即显示出来,而是会暂时保存起来,保存在了用户C语言级别的缓冲区中,sleep五秒过后才会显示到显示器,并且与下一条命令不存在换行。

以下代码什么现象?

[yyh@ecs-86081 probar]$ cat mycode.c
#include
#include

int main()
{

  printf("hello world");
  fflush(stdout);

  sleep(5);
  return 0;
}

fflush会刷新缓冲区,所以不需要带\n就可以立即显示到显示屏上,然后再sleep休眠五秒。

C语言程序,默认会打开三个输入输出流:
  stdin     stdout     stderr
   键盘     显示器     显示器

注意:凡是显示到显示器上面的内容都是字符(例如像123显示到显示器中,实际上是1字符2字符3字符)。凡是从键盘中读取的内容也都是字符。所以显示器和键盘这样的设备都称之为字符设备。

进度条代码

  1 #include
  2 #include
  3 #include
  4 #define NUM 100
  5 int main()
  6 {
  7   char bar[NUM+1];//多给一个空间用来存放\0
  8   memset(bar,'\0',sizeof(bar));
  9   int i = 0;
 10   const char* lable="\\/-\\";//用以打印不断旋转的光标,注意反斜杠\是一个特殊的字符,需要用\\来转义得到'\'
 11   while(i<=100)
 12   {
 13     printf("[%-100s][%d%%]%c\r",bar,i,lable[i%4]);                                                                                                                                     
 14     //注意加上\r用以回车
 15     //两个%%表示打印一个%
 16     //-100s表示自左向右打印100个字符
 17     //lable需要%上4,因为要循环打印
 18     fflush(stdout);//刷新缓冲区
 19     bar[i]='#';//每一次比上一次多一个#号
 20     i++;
 21     usleep(50000);//基于us级别的休眠,这里的50000us相当于0.5s
 22   }
 23   printf("\n");
 24 }

运行结果:

[yyh@ecs-86081 probar]$ ./proc
[####################################################################################################][100%]/

你可能感兴趣的:(linux,linux,运维,服务器)