linux小程序—进度条(动态演示)
创始人
2024-05-09 19:40:26
0

文章目录

  • 1. \n与\r的区别
    • 1. linux环境下
    • 2. windows环境下
  • 2. 缓冲区问题
    • 1.\n的情况
    • 2.\r的情况
    • 3. \n与\r的情况对比
    • 4. 使用fflush函数观察\r情况
    • 5. 不为\n与\r的情况
  • 3.进度条的实现
    • 1. printf 打印字符问题
      • 1. 修改前
      • 2.修改后
    • 2 . 注意事项
    • 3. 整体实现
      • 1. makefile(自动化编译工具)
      • 2. proc.c(函数的实现)
      • 3.proc.h(函数的定义与头文件)
      • 4. main.c(主函数)
    • 3. 动态图展示

1. \n与\r的区别

1. linux环境下

下面的演示皆在linux环境下

\n:换行
在这里插入图片描述

  • 在linux下,使用\n后光标会来到下一行与之平行的位置

\r:回车
在这里插入图片描述

  • 在linux中,使用\r会使光标回到这一行开头的位置

2. windows环境下

在这里插入图片描述

  • 在VS中,使用\n实际上起到回车+换行的作用, \n默认为\r\n

2. 缓冲区问题

1.\n的情况

在这里插入图片描述

>当使用 hello world\n时,发现会直接打印出 hello world

2.\r的情况

为了方便观察 ,使用一个休眠函数sleep,使其休眠1秒,发现最终什么也打印出不来

在这里插入图片描述

3. \n与\r的情况对比

  • 对比\n与\r的两种情况,实际上是因为行缓冲区的存在导致的,在\n的程序中,\n有刷新缓冲区的作用,所以会立即显示hello world
  • 而在\r的程序中,在使用printf函数时,每打印一个字符,光标就会往后移动,但是遇见\r时,光标会回到该行的开头位置,最后被命令行提示符覆盖掉

4. 使用fflush函数观察\r情况

  • 为了刚好观察这一现象,我们把fflush 函数(作用为刷新缓冲区)放入printf函数与sleep函数休眠之间,
    fflush(stdout)
    stdout为标准输出流

    在这里插入图片描述

此时可以清楚的观察到,是先运行printf函数,遇见\r使光标回到该行的开头,然后才被命令提示符覆盖

5. 不为\n与\r的情况

在这里插入图片描述
此时发现结果竟然是先休眠,然后才先出来hello world ,
难道是执行的sleep函数, 再去执行的printf函数吗?

当然不是!
c语言中一定是自上而下运行的,所以一定先执行printf函数,在执行sleep休眠,
由于hello world 没有被刷新,在sleep期间hello world一直保留在缓冲区中,
直到程序结束,系统自动刷新缓冲区,所以在休眠2秒后显示hello world

3.进度条的实现

1. printf 打印字符问题

1. 修改前

在这里插入图片描述

当我们使用\r 及fflush函数,去实现一个从10开始显示的倒数实现
发现使用%d输出后,printf函数打印出了实际上是以字符的形式体现的,10可以看作是两个字符,而9是一个字符,所以只会替换掉字符1的位置,打印出 9 0 两个字符
所以要使用%2d,覆盖2个字符位置使其右对齐

2.修改后

在这里插入图片描述
使用%2d后,使其修改两个字符,若为一个字符时,右对齐

2 . 注意事项

  • 创建一个字符串,使用\r,每次输出#后,返回该行的开头,并在下次循环使用##替换掉#,并以此循环下去
  • 使用printf(“\n”); 是为了防止最后显示的命令提示符覆盖掉输出的结果
  • 使用memset进行初始化,字符数组开辟101个空间是因为字符串最后以\0结尾,而全部初始化为\0,就不用再结尾考虑\0的问题了
  • 使用%-100s ,是为了让#从左开始打印,并且没有打印的地方预留出空白区域
    -usleep函数是以微妙为单位进行
    1秒=10^6微妙 100000微秒=0.1秒 设置以0.1秒为间隔

3. 整体实现

1. makefile(自动化编译工具)

  1 myproc: main.c proc.c2     gcc -o myproc main.c proc.c3 .PHONY:clean4 clean:5   rm -f myproc     

2. proc.c(函数的实现)

 #include"proc.h"2 #define size 1013 void process()4 {5   char arr[size];6   memset(arr,'\0',sizeof(char)*size);//全部 初始化为'\0'7   char str[]="|/-\\";8   int i=0;9   for(i=0;i<=100;i++)10   {11     arr[i]='#';12      printf("[%-100s][%d%%][%c]\r",arr,i,str[i%4]);13      fflush(stdout);//刷新缓冲区14      usleep(100000);//间隔0.1秒输出15   }16   printf("\n");17 } 

3.proc.h(函数的定义与头文件)

 #include2 #include//usleep函数3 #include     

4. main.c(主函数)

#include"proc.h"2 int main()3 {4   process();5   return 0;                                                                                                                                       6 }

3. 动态图展示

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...