• Linux 小程序-进度条


    1.进度条准备知识

            1.1回车与换行

            以前的键盘会有一个这样的按键 ,这个键就是回车与换行。

            回车:从当前行回退到当前行的起始位置。

            换行:从当前行切换到下一行的该位置。

            有了以上的认识我们可以写出一个简单的倒计时代码:

            注意:在linux下 “\r” 是回车然后在打印。

            这样就能在显示行打印出倒计时的感觉了。

    1.2缓冲区

            先来看一段代码

                     现象:

                    命令行先停止了三秒,然后才会出来 hello word。

                    这是为什么呢?是先执行了sleep(3); 这一行代码吗?

                    不是的,因为c对io函数提供了一个缓冲区,这段代码执行的结果先被保存在缓冲区中,之后等程序完成后才刷新到屏幕上。

                    所以有没有什么方法让显示器即刻刷新?有的!通过使用 fflush(stdout) 命令!

                    这样就能即可在命令行刷新出hello word 无需等待!!!

    1.3简单进度条

            简单进度条的代码如下:

    2.进度条

            1.创建makefile文件

    2.进度条代码

            1.在主函数中调用函数。

              2.头文件中定义各种变量

            3.

            进度条运行过程: 

            结束:

    3.进度条进阶

            上面写的进度条并没有根据实际的下载进度来显示进度,而是以固定模式来显示进度。

            我们可以根据当前的实际情况来显示进度,比如根据文件的传输速率来显示进度。

    代码:

    makefile:

    1. 1 processbar:main.o processbar.o
    2. 2 gcc -o $@ $^
    3. 3 main.o:main.c
    4. 4 gcc -c main.c
    5. 5 processbar.o:processbar.c
    6. 6 gcc -c processbar.c
    7. 7
    8. 8 .PHONY:clean
    9. 9 clean:
    10. 10 rm main.o processbar.o processbar
    11. 11

    processbar.h

    1. 1 #pragma once
    2. 2 #include
    3. 3 #include
    4. 4 #include
    5. 5
    6. 6 #define NUM 102
    7. 7 #define Body '='
    8. 8 #define Head '>'
    9. 9
    10. 10 void process();
    11. 11 typedef void (*callback_t)(double);
    12. 12
    13. 13 void process_flush( double rate );

    processbar.c

    1. #include"processbar.h"
    2. 2
    3. 3 const char *lable = "|/-\\|/-\\";
    4. 4
    5. 5
    6. 6 //version1
    7. 7 void process()
    8. 8 {
    9. 9 char buffer[NUM];
    10. 10 memset(buffer , '\0',sizeof(buffer));
    11. 11 int cnt = 0;
    12. 12 int n = strlen(lable);
    13. 13 buffer[0] = Head;
    14. 14 while(cnt <= 100)
    15. 15 {
    16. 16 printf("[%-100s][%3d%%][%c]\r",buffer,cnt,lable[cnt%n]);
    17. 17
    18. 18 fflush(stdout);
    19. 19 buffer[cnt++] = Body;
    20. 20 if(cnt < 100) buffer[cnt] = Head;
    21. 21 usleep(50000);
    22. 22
    23. 23 }
    24. 24
    25. 25 printf("\n");
    26. 26
    27. 27 }
    28. 1 //version : 进度是多少,你的进度条能知道吗另外,什么进度?依附于其他应用,比如下载
    29. 32 //
    30. 33 char buffer[NUM] = {0};
    31. 34 void process_flush(double rate)
    32. 35 {
    33. 36
    34. 37 static int cnt = 0;
    35. 38 int n = strlen(lable);
    36. 39 if(rate <= 1.0) buffer[0] = Head;
    37. 40
    38. 41 printf("[%-100s][%.1f%%][%c]\r",buffer,rate,lable[cnt%n]);
    39. 42
    40. 43 fflush(stdout);
    41. 44 buffer[(int)rate] = Body;
    42. 45 if((int)rate+1 < 100) buffer[(int)(rate+1)] = Head;
    43. 46 if(rate>= 100.0) printf("\n");
    44. 47
    45. 48 cnt++;
    46. 49 cnt %= n;
    47. 50 }

    main.c:

    1. #include<time.h>
    2. 3 #include<stdlib.h>
    3. 4 #define FILESIZE 1024*1024*1024
    4. 5
    5. 6 void download(callback_t cd)
    6. 7 {
    7. 8 srand(time(NULL)^1023);
    8. 9 int total = FILESIZE;
    9. 10 while(total)
    10. 11 {
    11. 12 usleep(1000);
    12. 13 int one = rand()%(1024*1024);
    13. 14 total -= one;
    14. 15 if(total < 0) total = 0;
    15. 16
    16. 17 //当前的进度是多少?
    17. 18 int download = FILESIZE - total;
    18. 19 double rate = (download*1.0 /(FILESIZE))*100.0;
    19. 20 cd(rate);
    20. 21 // printf("download: %f\n",rate); //rate有啦,应该让进度条刷新
    21. 22
    22. 23
    23. 24 }
    24. 25
    25. 26
    26. 27 }
    27. int main()
    28. 34 {
    29. 35 // process();
    30. 36 download(process_flush);
    31. 37 return 0 ;
    32. 38 }

            

  • 相关阅读:
    创建springboot(五)文章发表项目
    element -ui table表格内容无限滚动 使用插件vue-seamless-scroll
    Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
    前端工作小结82-当前函数造成
    力扣 #167.两数之和 II - 输入有序数组 JAVA实现
    ESP8266-Arduino编程实例-红外接收
    [附源码]计算机毕业设计springboot学生综合数据分析系统
    中高价位搭载率超过60%!NOA几乎标配!APA赛道持续升温
    基于php+thinphp+vue的商品购物商城网站
    2023年高教杯数学建模2023B题解析(仅从代码角度出发)
  • 原文地址:https://blog.csdn.net/kqs__/article/details/134387231