• Linux第一个小程序——进度条


    预备知识——缓冲区与换行

            先把重要结论放这:

    1. 数据的输入输出不会马上到达目的地,会先呆在缓冲区。
    2. 缓冲区相当于一行数据空间。
    3. 回车时,光标回到开头,相当于清空原有数据。
    4. 换行时,会直接将缓冲区数据输出。
    5. 程序结束时,会强制将缓冲区的数据输出。

            详情见我的另一篇文章:

    缓冲区与回车换行-CSDN博客

    写一个倒计时程序

    1. #include
    2. #include
    3. int main()
    4. {
    5. int i = 10;
    6. while(i)
    7. {
    8. printf("%-2d\r", i);
    9. fflush(stdout);
    10. sleep(1);
    11. i--;
    12. }
    13. return 0;
    14. }

     %-2d,保留两位数且向左对齐

    编写入门版进度条

    1. #include
    2. #include
    3. #include
    4. #define MAX 101
    5. #define LABEL '='
    6. int main()
    7. {
    8. char bar[MAX];
    9. memset(bar, '\0', sizeof(bar));
    10. int count = 101;
    11. while(count--)
    12. {
    13. bar[100 - count] = LABEL;
    14. usleep(100000);
    15. printf("%s\r", bar);
    16. fflush(stdout);
    17. }
    18. printf("\n");
    19. return 0;
    20. }

    多文件编写升级版进度条

    Version1

    main.c

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

    processbar.h

    1. #pragma once
    2. #include
    3. #define NUM 101
    4. #define Body '='
    5. #define Head '>'
    6. void processbar();

    processbar.c

    1. #include"processbar.h"
    2. #include
    3. #include
    4. const char *loading = "|/-\\";
    5. void processbar()
    6. {
    7. char bar[NUM];
    8. int n = strlen(loading);
    9. memset(bar, '\0', sizeof(bar));
    10. int cnt = 0;
    11. while(cnt <= 100)
    12. {
    13. bar[cnt++] = Body;
    14. if(cnt < 100)
    15. bar[cnt] = Head;
    16. printf("[%-101s][%3d%%][%c]\r", bar, cnt - 1, loading[cnt%n]);
    17. fflush(stdout);
    18. usleep(100000);
    19. }
    20. printf("\n");
    21. }

    makefile

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

    Version2

    main.c

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

    processbar.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define NUM 101
    8. #define Body '='
    9. #define Head '>'
    10. #define FILESIZE 1024*1024*1024
    11. void processbar();

    processbar.c

    1. #include"processbar.h"
    2. char bar[NUM];
    3. const char *label = "|/-\\";
    4. void processbar()
    5. {
    6. int total = FILESIZE;
    7. int num = 0;
    8. srand(time(NULL)^1023);
    9. memset(bar, '\0', sizeof(bar));
    10. while(total)
    11. {
    12. usleep(100000);
    13. int one = rand()%(1024*1024*50);
    14. total -= one;
    15. if(total < 0) total = 0;
    16. double rate = ((FILESIZE - total)*1.0 / (FILESIZE)) * 100.0;
    17. num++; num %= 4;
    18. memset(bar, Body, sizeof(char)*((int)rate + 1));
    19. if((int)rate < 100) bar[(int)rate] = Head;
    20. printf("[%-101s][%6.2f%%][%c]\r", bar, rate, label[num]);
    21. fflush(stdout);
    22. }
    23. printf("\n");
    24. }

    makefile

    1. processbar:main.o processbar.o
    2. gcc -o $@ $^
    3. main.o:main.c
    4. gcc -c main.c
    5. processbar.o:processbar.c
    6. gcc -c processbar.c
    7. .PHONY:clean
    8. clean:
    9. rm processbar main.o processbar.o
  • 相关阅读:
    风控建模还在用IV特征分箱“老方法”,何不试下这个更有效的实操
    数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存
    循环结构--for循环
    [C++ 网络协议] 异步通知I/O模型
    LeetCode 82 删除排序链表中的重复元素 II
    基于gis三维可视化的智慧城市行业运用
    axios从入门到源码分析之axios 源码分析(二)
    7、GC日志详解
    llvm版本
    一些 dp 题
  • 原文地址:https://blog.csdn.net/weixin_73483158/article/details/139261516