Linux第一个小程序——进度条

预备知识------缓冲区与换行

先把重要结论放这:

  1. 数据的输入输出不会马上到达目的地,会先呆在缓冲区。
  2. 缓冲区相当于一行数据空间。
  3. 回车时,光标回到开头,相当于清空原有数据。
  4. 换行时,会直接将缓冲区数据输出。
  5. 程序结束时,会强制将缓冲区的数据输出。

详情见我的另一篇文章:

缓冲区与回车换行-CSDN博客

写一个倒计时程序

cpp 复制代码
#include<stdio.h>
#include<unistd.h>

int main()
{
  int i = 10;
  while(i)
  {
    printf("%-2d\r", i);
    fflush(stdout);
    sleep(1);
    i--;
  }
  return 0;
}

%-2d,保留两位数且向左对齐

编写入门版进度条

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

#define MAX 101
#define LABEL '='

int main()
{
  char bar[MAX];
  memset(bar, '\0', sizeof(bar));
  int count = 101;
  while(count--)
  {
    bar[100 - count] = LABEL;
    usleep(100000);
    printf("%s\r", bar);
    fflush(stdout);
  }
  printf("\n");
  return 0;
}

多文件编写升级版进度条

Version1

main.c

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

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

processbar.h

cpp 复制代码
#pragma once

#include<stdio.h>

#define NUM 101
#define Body '='
#define Head '>'

void processbar();

processbar.c

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

const char *loading = "|/-\\";

void processbar()
{
  char bar[NUM];
  int n = strlen(loading);
  memset(bar, '\0', sizeof(bar));
  int cnt = 0;
  while(cnt <= 100)
  {
    bar[cnt++] = Body;
    if(cnt < 100)
      bar[cnt] = Head;
    printf("[%-101s][%3d%%][%c]\r", bar, cnt - 1, loading[cnt%n]);
    fflush(stdout);
    usleep(100000);
  }
  printf("\n");
}

makefile

cpp 复制代码
processbar:main.o  processbar.o
	gcc -o $@ $^

main.o:main.c
	gcc -c main.c

processbar.o:processbar.c
	gcc -c processbar.c

.PHONY:clean

clean:
	rm processbar main.o processbar.o

Version2

main.c

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

int main()
{
  processbar();

  return 0;
}

processbar.h

cpp 复制代码
#pragma once

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define NUM 101
#define Body '='
#define Head '>'
#define FILESIZE 1024*1024*1024

void processbar();

processbar.c

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

char bar[NUM];
const char *label = "|/-\\";

void processbar()
{
  int total = FILESIZE;
  int num = 0;
  srand(time(NULL)^1023);
  memset(bar, '\0', sizeof(bar));
  while(total)
  {
    usleep(100000);
    int one = rand()%(1024*1024*50);
    total -= one;
    if(total < 0) total = 0;
    double rate = ((FILESIZE - total)*1.0 / (FILESIZE)) * 100.0;
    num++; num %= 4;
    memset(bar, Body, sizeof(char)*((int)rate + 1));
    if((int)rate < 100) bar[(int)rate] = Head;
    printf("[%-101s][%6.2f%%][%c]\r", bar, rate, label[num]);
    fflush(stdout);
  }
  printf("\n");
}

makefile

cpp 复制代码
processbar:main.o  processbar.o
	gcc -o $@ $^

main.o:main.c
	gcc -c main.c

processbar.o:processbar.c
	gcc -c processbar.c

.PHONY:clean

clean:
	rm processbar main.o processbar.o
相关推荐
EasyNVR14 分钟前
基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
运维·服务器·微信·小程序·webrtc·p2p·智能硬件
技术小齐31 分钟前
网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
运维·网络·学习
致奋斗的我们40 分钟前
HAProxy介绍与编译安装
linux·汇编·数据库·mysql·青少年编程·haproxy·openeurler
Java潘老师1 小时前
Automa 浏览器自动化编排 实现自动化浏览器操作
运维·自动化
waves浪游1 小时前
Linux基本指令(上)
linux·运维·服务器
不确定性确定你我1 小时前
`sh` 与 `bash` 的区别详解
linux·bash·运维开发
是北欢吆2 小时前
QQ登录测试用例报告
运维·服务器·测试用例
9毫米的幻想3 小时前
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
linux·运维·服务器·c语言·c++
刘什么洋啊Zz3 小时前
剖析IO原理和零拷贝机制
java·运维·网络
升讯威在线客服系统3 小时前
如何通过 Docker 在没有域名的情况下快速上线客服系统
java·运维·前端·python·docker·容器·.net