Linux第一个小程序-进度条

目录

\r&&\n

行缓冲区概念

倒计时程序

进度条代码


\r&&\n

回车概念
换行概念
  • \n
[root@VM-12-17-centos lesson8]# touch test.c
[root@VM-12-17-centos lesson8]# touoch Makefile
bash: touoch: command not found
[root@VM-12-17-centos lesson8]# touch Makefile
[root@VM-12-17-centos lesson8]# vim Makefile
[root@VM-12-17-centos lesson8]# ll
total 4
-rw-r--r-- 1 root root 71 Jan 13 21:43 Makefile
-rw-r--r-- 1 root root  0 Jan 13 21:40 test.c
[root@VM-12-17-centos lesson8]# vim test.c
[root@VM-12-17-centos lesson8]# make
gcc -o mytest test.c
[root@VM-12-17-centos lesson8]# ls
Makefile  mytest  test.c
[root@VM-12-17-centos lesson8]# ./mytest
hello world
[root@VM-12-17-centos lesson8]# cat test.c
#include
int main()
{
  printf("hello world\n");

  return 0;
}
  • \r
[root@VM-12-17-centos lesson8]# vim test.c
[root@VM-12-17-centos lesson8]# make
gcc -o mytest test.c
[root@VM-12-17-centos lesson8]# cat test.c
#include
int main()
{
  printf("hello world\r");
 
  return 0;
}
[root@VM-12-17-centos lesson8]# ./mytest
[root@VM-12-17-centos lesson8]# make clean
rm -f mytest
  • \r\n
    [root@VM-12-17-centos lesson8]# vim test.c
    [root@VM-12-17-centos lesson8]# make clean
    rm -f mytest
    [root@VM-12-17-centos lesson8]# cat test.c
    #include
    int main()
    {
      printf("hello world\r\n");
     
      return 0;
    }
    [root@VM-12-17-centos lesson8]# make 
    gcc -o mytest test.c
    [root@VM-12-17-centos lesson8]# ./mytest
    hello world
    

行缓冲区概念

#include 
int main()
{
 printf("hello world\n");
 sleep(3);
 return 0;
}

什么现象?        直接打印hello world,好像没有执行sleep

#include 
int main()
{
 printf("hello world");
 sleep(3);
 return 0;
}

什么现象??    先不显示,隔一段时间再打印,好像是先执行了sleep,再执行printf?

        并不是!!一定是先执行printf(从上到下),再执行sleep,sleep时,hello world字符串没有被刷新,数据在sleep期间被保存起来了。

        为什么\n,数据就显示出来了呢?缓冲区有自己的刷新策略,包括行缓冲

        我们也可以自主刷新,使用一定的函数帮助我们实现自主刷新

#include 
int main()
{
 printf("hello world");
 fflush(stdout);
 sleep(3);
 return 0;
}

        \r不显示的情况,其光标到达hello world的后一位,遇到\r回到此行最前面,Xshell接着打印[root@VM-12-17-centos lesson8]将hello world覆盖了,为了使其效果明显,我们改变自主刷新的位置

修改前

#include
int main()
{
  printf("hello world\r");
  sleep(3);
  fflush(stdout);
  return 0;
}

修改后

#include 
int main()
{
 printf("hello world\r");
 fflush(stdout);
 sleep(3);
 return 0;
}

倒计时程序

        根据上述的\r\n的特性,我们编写一个倒计时程序
#include
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\n",i);                                                                                             
         sleep(1);
    
    }
    
   return 0;
}
Linux第一个小程序-进度条_第1张图片
         我们尝试用\r,其字符在缓冲区存放,并未刷新,所以并不显示
#include
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\r",i);                                                                                             
         sleep(1);
    
    }
    
   return 0;
}
Linux第一个小程序-进度条_第2张图片

         

        我们使用函数对其刷新,方便看倒计时

#include
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\r",i);
         fflush(stdout);                                                                                             
         sleep(1);
    
    }
   printf("\n"); 
   return 0;
}

        我们尝试从10开始倒计时,键盘设备称为字符设备,是按字符打印、显示,所以从10开始倒计时,我们不能单纯地修改i的初始值为10,我们可以%2d去预留两个字符

#include
int main()
{
    int i=10;
    for(;i>=0;i--)
    {
         printf("%2d\r",i);
         fflush(stdout);                                                                                             
         sleep(1);
    
    }
   printf("\n"); 
   return 0;
}

进度条代码

样式

新建

[root@VM-12-17-centos lesson8]# mkdir proc
[root@VM-12-17-centos lesson8]# cd proc
[root@VM-12-17-centos proc]# touch proc.c
[root@VM-12-17-centos proc]# touch proc.h
[root@VM-12-17-centos proc]# touch main.c

main.c内

 #include "proc.h"
 
 int main()
 {
   process();
 
   return 0;
 }   

 proc.h内

[root@VM-12-17-centos proc]# vim proc.h
[root@VM-12-17-centos proc]# cat proc.h
#pragma once 

#include 

​extern void process();

proc.c内

#include "proc.h"
#include
#include

#define SIZE 102
#define STYLE '='
#define ARR '>'

// "|/-\\"
void process()
{
  const char *lable = "|/-\\";
  char bar[SIZE];
  memset(bar,'\0',sizeof(bar));
  int i=0;
  while(i<=100)
  {
    printf("[%-100s][%d%%][%c]\r",bar,i,lable[i%4]);
    fflush(stdout);
    bar[i++]=STYLE;
    if(i!=100)
    bar[i]=ARR;
    usleep(100000);
  }
  printf("\n");
}

Makefile

[root@VM-12-17-centos proc]# touch Makefile
[root@VM-12-17-centos proc]# vim Makefile
[root@VM-12-17-centos proc]# cat Makefile
myprocess:main.c proc.c
	gcc -o myprocess main.c proc.c

.PHONY:clean
clean:
	rm -f myprocess

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