当前位置:   article > 正文

C语言实现进度条小程序

C语言实现进度条小程序

写在文前

今天我们实现一个进度条的小玩意儿,很简单,我们先看看成果

进度条

缓冲区

在学习计算机时,你在很多地方有可能看到到缓冲区的字样,那什么是缓冲区啊?,我们先看一下现象

我是在Linux环境下演示,window环境下演示可能会没有效果。

#include <stdio.h>    
      
  int main()    
  {    
    printf("你好,缓冲区");    
      
    sleep(3);  //在Linux环境下sleep的单位 秒                                                                                                                                                        
    return 0;    
  } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

缓冲区

你会发现当我们执行程序时,会有大概几秒的延迟,可我们不是先执行的printf函数吗,后面才是sleep,实际上这也是事实,只不过当我执行printf后,我们想要输出的内容被放到一个缓冲区里面了,后面才会被打印出来,下面我将仔细的说一下什么缓冲区

本质上 缓冲区就是一块内存,我们将想要输出的数据放到缓冲区中,当我们刷新缓冲区的时候会把他打印出来,我们可以把数据当成一个水池,缓冲区看作打水的的木桶,当水桶满了的时候或者我们就是想要一半的水,就把水倒出来。

什么情况下缓冲区会刷新

  • 全缓冲 缓冲区满了,会刷新
  • 行缓冲 我们使用换行符,缓冲区也会刷新
  • 函数缓冲 我们使用某个函数强制刷新
  • 程序退出,自动刷新

下面我们一一演示

全缓冲

我们演示一下,大家就懂了

#include <stdio.h>

int main()
{
    while(1)
    {
        printf("hello world");
        sleep(3);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Inked缓冲区满了

由于时间有些长,我们就不等了,结果是当缓冲区满了后,屏幕上会出现一屏幕的 hello world

行缓冲

我们这里的换行是指的 \n,它可以是缓冲区刷新

#include <stdio.h>

int main()
{
    while(1)
    {
        printf("hello world\n");
        sleep(3);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

换行

函数缓冲

在C语言中提供了一个函数,它可以强制刷新缓冲区,这就是 fflush(),它是stdio.h中的库函数,在一个C程序中,编译器会默认打开 3 个标准输入输出流,分别是下面的,这一点知道就可以了

  1. stdin
  2. stdout
  3. stderr
#include <stdio.h>

int main()
{
    while(1)
    {
        printf("hello world");
        fflush(stdout);
        sleep(3);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

刷新

\n 和 \r

有很多人都搞不懂这两个有什么区别,我们今天重点说一下

  • \n 叫做 换行
  • \r 叫做 回车

我们举一个写文章的例子,当我们在“我叫张三,外号法外狂徒。”这句话再开一行时,看看他们之间的区别

image-20220305183128541

有人可能会感到疑惑,这和我们用的不对啊,我们之前使用下面的代码时,都是再下一行的开头直接打印,实际上这是C语言的编译器默认将换行回车这两个浓缩到 \n了

printf("hello world\n");
printf("hello world\n");
  • 1
  • 2

演示效果 \r

我们先演示一下效果

#include "ProcBar.h"    
      
  int main()    
  {    
    int count = 10;    
    while(count--)    
    {    
      printf("%d\r",count);    
      sleep(1);                                                                         
    }                                           
    printf("hello word\n");            
                                                
    return 0;                                   
  } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

效果gif

注意看,我们没有打印出9,8,7,6,5这样的数据,原因是缓冲区的因素,我们使用函数刷新一下缓冲区看看效果

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

刷新缓冲区

进度条

有了上面的知识点,我们就可以写出自己的进度条了,由于多文件情况下阅读的体验不太好,我把代码写在一个文件中

  • usleep() 和 sleep()的作用一样,不过它的单位是 毫秒

  • memset() 是 string.h库的一个函数,它可以把数组内部都初始化指定的 数据

  • %-100s 设置100的字段,- 表示 左对齐

  • %d%% 是为了了打印 百分比 %是转换说明,所以用 两个%代替一个% %% -> % 详细的请

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/264219
推荐阅读
相关标签