『Linux升级路』进度条小程序

慈云数据 2024-04-09 技术支持 56 0

🔥博客主页:小王又困了

📚系列专栏:Linux

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、预备知识

📒1.1缓冲区

📒1.2回车和换行

二、倒计时

📒2.1源代码

📒2.2注意事项

三、进度条

📒3.1源代码

📒3.2实际应用


一、预备知识

📒1.1缓冲区

我们先观察两段代码的现象:

#include 
#include 
int main() 
{
    printf("Hello Linux!\n");      
  
    sleep(3);
    return 0;
}

 这段代码先执行printf函数,在屏幕上打印出Hellow Linux!,然后执行sleep函数让函数休眠3秒,最后程序结束。

#include 
#include 
int main() 
{
    printf("Hello Linux!");      
  
    sleep(3);
    return 0;
}

 通过上图我们可以看到,当我们去掉 ‘\n’ 对代码进行编译,程序先休眠了3秒,然后在屏幕上打印Hellow Linux!。由于去掉了‘\n’ ,也没有换行。

📝现象分析:

      看到上面的现象,大家一定会有很大的疑惑。难道程序是先执行了sleep函数,然后再去执行printf函数。这样的猜想是错误的,任何一个C语言程序,没有遇到选择和循环语句,都要严格按照顺序结构去执行,代码都是从上到下依次执行。所以一定是先执行printf函数,再执行sleep函数。那在休眠的3秒里,Hellow Linux!去了哪里呢?代码被保存在了缓冲区中,默认当程序结束的时候才会将缓冲区中的内容刷新出来,带 \n 就是要求把缓冲区的的数据立即刷新到显示器上。

  • 缓冲区是一种用于临时存储数据的区域,通常用于临时保存数据以平衡数据处理速度不匹配的情况。 

    📒1.2回车和换行

         回车和换行是两个与文本文件和文本编辑有关的控制字符,它们在不同的操作系统和编程环境中可能有不同的表现。

    📝回车:将光标移动到当前行的开始(最左侧)

    • 表示为ASCII字符 \r 。
    • 在打字机时代,回车的原意是将打印头移动到行首,以便在同一行上写入新的文本。
    • 计算机中,回车通常表示将光标移动到当前行的开头,但不换行到新的一行。

      📝换行:将光标水平方向保持不变,竖直方向向下平移一行。

      • 表示为ASCII字符 \n
      • 在打字机时代,换行的原意是将纸向上移动一行,以便在新的行上写入文本。
      • 在计算机中,换行通常表示将光标移动到下一行的开头。

        二、倒计时

        📒2.1源代码

         学习了上面的知识,我们可以写一个倒计时的小程序。

        📖源代码

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

        📖效果演示

        如上图,运行我们的程序,却没有想要的倒计时效果,这是因为我们没有刷新缓冲区,执行的结果都存放在缓冲区 。我们要使用fflush接口来刷新缓存区。

        📝刷新缓冲区

        任何一个C程序运行的时候都会默认帮我们打开以下三个流:

        • stdin —— 标准输入流(键盘)
        • stdout —— 标准输出流(显示器)
        • stderr —— 标准错误(显示器)

          这三个流都是FILE*的指针,所以任何一个C程序运行的时候,操作系统会帮我们打开以上三个文件。我们只需要看stdout标准输出流,使用fflush接口刷新。

          📖源代码

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

           📖效果演示

          📒2.2注意事项

          📝格式化控制

               我们需要知道,往显示器上打印整型10,本质上是打印了字符1和字符0。因此打印10,会占用两个字符,而打印0~9只需要一个字符,所以 \r 回车之后只会覆盖一个字符,对第二个字符0始终没有影响,因此我们需要用%-2d来控制,每次打印两个位宽的字符, - 表示将这两个字符左对齐。如果不进行格式化控制,打印出来的结果将是下面这样:

          三、进度条

          📒3.1源代码

               我们实现的进度条进度条除了有进度的推进,还要有百分比提示和转动提示。

          📖processBar.h

          #pragma once
          #include 
          #include 
          #include 
          #define NUM 103
          #define BODY '='
          #define HEAD '>'  
          void processbar();

          📖processBar.c

          #include "processbar.h"//引用头文件
          const char* lable = "|/-\\";//转动提示
          void processbar()
          {
              char bar[NUM];
              int cnt=0;
              memset(bar,'\0',sizeof(bar));
              int len=strlen(lable);
              bar[cnt]=HEAD;
              while(cnt
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon