C语言实现进度条小程序

目录

  • 写在文前
  • 缓冲区
    • 全缓冲
    • 行缓冲
    • 函数缓冲
  • \n 和 \r
    • 演示效果 \r
  • 进度条

写在文前

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

缓冲区

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

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

#include     
      
  int main()    
  {    
    printf("你好,缓冲区");    
      
    sleep(3);  //在Linux环境下sleep的单位 秒                                                                                                                                                        
    return 0;    
  } 

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

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

什么情况下缓冲区会刷新

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

下面我们一一演示

全缓冲

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

#include 

int main()
{
    while(1)
    {
        printf("hello world");
        sleep(3);
    }
    return 0;
}

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

行缓冲

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

#include 

int main()
{
    while(1)
    {
        printf("hello world\n");
        sleep(3);
    }
    return 0;
}

函数缓冲

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

  1. stdin
  2. stdout
  3. stderr
#include 

int main()
{
    while(1)
    {
        printf("hello world");
        fflush(stdout);
        sleep(3);
    }
    return 0;
}

\n 和 \r

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

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

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

C语言实现进度条小程序_第1张图片

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

printf("hello world\n");
printf("hello world\n");

演示效果 \r

我们先演示一下效果

#include "ProcBar.h"    
      
  int main()    
  {    
    int count = 10;    
    while(count--)    
    {    
      printf("%d\r",count);    
      sleep(1);                                                                         
    }                                           
    printf("hello word\n");            
                                                
    return 0;                                   
  } 

注意看,我们没有打印出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;                                   
  } 

进度条

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

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

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

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

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

#ifndef __INCLUDE_H__  //防止头文件被重复引用
#define __INCLUDE_H__

#include 
#include 

#endif

void proBar()
{
	const char* p = "|/-\\";
	int i = 0;
	char arr[101] = { 0 };
	memset(arr, '\0', sizeof(arr));
	while (i <= 100)
	{
		printf("[%-100s][%d%%][%c]\r", arr, i, p[i % 4]);
		fflush(stdout);
		arr[i++] = '#';
		usleep(80000);
	}
	printf("\n");
}

int main()
{
	proBar();
	return 0;
}

这样,你的进度条就完成了,我们也可以给进度条添加颜色,C语言是支持的,不过这就要你自己去处理了

你可能感兴趣的:(C语言,开发语言,后端,c语言,vim)