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;
}

相关推荐
hello_ world.21 分钟前
RHCA10NUMA
linux
神秘人X7071 小时前
Linux高效备份:rsync + inotify实时同步
linux·服务器·rsync
轻松Ai享生活1 小时前
一步步学习Linux initrd/initramfs
linux
轻松Ai享生活1 小时前
一步步深入学习Linux Process Scheduling
linux
绵绵细雨中的乡音3 小时前
网络基础知识
linux·网络
Peter·Pan爱编程3 小时前
Docker在Linux中安装与使用教程
linux·docker·eureka
kunge20134 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5494 小时前
DVWA中级
linux
Sadsvit5 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok5 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux