Linux实现进度条小程序——缓冲区

📝Linux实现进度条小程序

  • [📝 行缓冲区](#📝 行缓冲区)
  • [📝 fflush函数](#📝 fflush函数)
  • [📝 示例](#📝 示例)
  • [📝 进度条](#📝 进度条)

好雨知时节
当春乃发生
随风潜入夜
润物细无声

回车换行其实是两个概念,一是回车,一是换行,换行是光标换到下一行,并不会到文本的开头,回车使光标回到当前行的开始,那在我们语言的层面是怎么做到对文本进行换行和回车的,我们平时说到 \n其实就是换行的意思的,但是语言的本身把他解释成回车换行,\r是回车的意思的,回车换行其实就是先换行再进行回车。

📝 行缓冲区

在C语言中行缓冲区,再我们运行程序的时候,我们会在屏幕上看到显示的内容,这些都是由字符组成的,那我们的C语言不是一个字符一个字符的显示再屏幕上,这样觉得消耗太大了,所以我们有了行缓冲区的概念,就是程序运行时的一块内存,把数据先放到这个内存里面,等到这个小内存满了,就直接一起全部给刷新出来,为什么又叫行缓冲区,就是当一行满了,就一起刷新出来,只有遇到\n或者scanf或者fflush这样的函数就会提前进行刷新,程序结束后,最终也会将数据进行刷新出来。

如下代码,这里sleep()睡眠函数,使用它需要包含头文件#include<unistd.h>,它的作用是能够让程序在某个位置停留一定时间后再继续运行。

bash 复制代码
make
./myfile

执行生成的可执行文件后,打印到屏幕上

在程序文件的加载过程中,并不是一路顺风的,经常会出现卡顿和进度突然变快和变慢的情况,这就要关系到缓冲区的概念了。

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
 printf("hello world");
 sleep(3);
 return 0;
}

若不带\n,则打印的数据再缓冲区里面,然后开始执行了sleep代码,最后程序结束了,就会一起刷新出来,最后从显示出来。

📝 fflush函数

我们想必须提前刷新出来,还有一种方法就是使用fflush函数。C语言会默认打开三个流,,一个是输入流stdin,一个是输出流stdout,一个是错误流stderr,而fflush的参数就是传流进出,这里是将数据输出,所以使用输出流。

cpp 复制代码
#include <stdio.h>
#include<unistd.h>
int main()
{
 printf("hello Makefile!");
 fflush(stdout);
 sleep(3);
 return 0;
}

这样就可以达到先打印的效果。

📝 示例

cpp 复制代码
#include <stdio.h>
#include<unistd.h>
int main(){
        //printf("hello owrld!\n");
        //sleep(3);
        //printf("hello world!\r");
        int i = 20;
        for(;i>=0;i--){
                printf("%2d\r",i);
                fflush(stdout);
                sleep(1);
        }
        return 0;
}

📝 进度条

样式我们希望是这样的:

bash 复制代码
[################           ][xx%][\]

分文件编写

如何编译运行

这里三个分文件如何在Linux下编译运行,创建一个Makefile

bash 复制代码
make
./myprocess

proc.h

cpp 复制代码
#pragma once


#include <stdio.h>

extern void process();

proc.c

cpp 复制代码
#include "proc.h"
#include <string.h>
#include <unistd.h>



#define SIZE 101
#define STYLE '='
#define ARR '>'

void process(){
  char bar[SIZE];
  memset(bar,'\0',sizeof(bar));
  int i =0;
  const char* label = "|/-\\";
  while(i<=100){
    printf("[\033[43;32;31m%-100s\033[0m][%d%%][%c]\r",bar,i,label[i%4]);
    fflush(stdout);
    bar[i++] = STYLE;
    if(i != 100) bar[i] = ARR;
    usleep(100000);
  }
  printf("\n");
  //printf("this demo process\n");
}

main.c

cpp 复制代码
#include "proc.h"

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

相关推荐
JunLan~2 小时前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
方竞3 小时前
Linux空口抓包方法
linux·空口抓包
dccose3 小时前
vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数
小程序·uni-app
海岛日记4 小时前
centos一键卸载docker脚本
linux·docker·centos
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
学Linux的语莫5 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
踏雪Vernon6 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
学Linux的语莫6 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器