• 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
  • 相关阅读:
    python-fire 链式调用解决命令行无法自动结束
    【VRP】基于常春藤算法IVY求解带时间窗的车辆路径问题TWVRP,最短距离附Matlab代码
    怎么有效地进行问卷发放?
    使用最新android sdk 将jar文件编译成dex
    行业选择有多重要?选Java我没后悔
    【信息系统项目管理师】 学习笔记 第1章 信息化发展
    完美指南|如何使用 ODBC 进行无代理 Oracle 数据库监控?
    Java筑基33-网络编程01-TCP网络编程&Socket
    【Golang之路】——slice总结
    ubuntu18.04 禁用自带nouveau后重启无法进入系统
  • 原文地址:https://blog.csdn.net/weixin_73483158/article/details/139261516