C++系统编程篇——Linux第一个小程序--进度条

(1)先引入一个概念:行缓冲区

\r\n

\r表示回车

\n表示回车并换行

①代码一

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

打印出了hello Makefile!,然后三秒后结束了运行

②代码二

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

什么也没显示,程序结束后打印出了hello Makefile!,同时在同一行出现了命令提示符

③代码三

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

打印出了hello Makefile!,然后三秒后结束了运行,同时在同一行出现了命令提示符

这是因为 printf("hello Makefile!"); 没有包含换行符,缓冲区的内容不会立即被刷新

printf 会先将数据写入到一个缓冲区中,只有在遇到换行符(\n),缓冲区满了,或者程序正常结束时,缓冲区的内容才会被真正输出到终端。

(2)进度条项目

根据上述特性,可以写出进度条,用字符#表示进度,打印出以后进行回车不换行,每次多加一个#,就能够实现进度条在加载的效果,而每次变更打印的内容为数字的话,就可以有进度在变更的效果。

<Processbar.h>

cpp 复制代码
#pragma once
 
#include<stdio.h>
typedef void(*callback_t)(double,double);                                                                                

void ProcBar(double total,double current);

<Processbar.c>

cpp 复制代码
#include"Processbar.h"
#include<string.h>
#include<unistd.h>
#define length 101
#define Style '#'

// version 1
const char *lable = "|/-\\";
//void ProcBar()
//{                                                                                                                      
//  char bar[length];
//  memset(bar,'\0',sizeof(bar));
//  
//  int len = strlen(lable);
//  int cnt = 0;
//  while(cnt <= 100)
//  {
//    printf("[%-100s][%3d%%][%c]\r",bar,cnt,lable[cnt%len]);
//    fflush(stdout);
//    bar[cnt++] = Style;
//    usleep(60000);
//  }                                                                                                                    
//  printf("\n");
//
//}
//

// version 2
void ProcBar(double total,double current)
{
    char bar[length];
    memset(bar,'\0',sizeof(bar));
    
    int len = strlen(lable);
    double rate = (current*100.0)/total;
    int cnt = 0;
    int loop_count = (int)rate;
    while(cnt <= loop_count)
    {
        bar[cnt++] = Style;
        //usleep(10000);
    }
    printf("[%-100s][%.1lf%%][%c]\r",bar,rate,lable[cnt%len]);
    fflush(stdout);
}

<Main.c>

cpp 复制代码
#include"Processbar.h"
#include<stdio.h>
#include<unistd.h>
//download

void download(double filesize,callback_t cb)
{
    double current = 0.0;//已下载量
    double bandwidth = 1024*1024*1.0;//带宽
    
    printf("download begin, current:%lf\n",current);
    
    while(current<=filesize)
    {
        cb(filesize,current);
        //从网络中获取数据
        current+=bandwidth;
        usleep(100000);
    }                                                                                                
    printf("\ndownload done, filesize:%.3lf\n",filesize);
}
int main()                                                                                                               
{
    download(100*1024*1024,ProcBar);
    download(2*1024*1024,ProcBar);
    download(200*1024*1024,ProcBar);
    download(400*1024*1024,ProcBar);
    download(50*1024*1024,ProcBar);
    
    //ForTest();
    // ProcBar(100.0,56.9);
    // ProcBar(100.0,1.0);
    // ProcBar(100.0,99.9);
    // ProcBar(100.0,100);
    // return 0;
}
相关推荐
qeen8717 分钟前
【算法笔记】双指针及其经典例题解析
c++·笔记·算法·双指针
ElfBoard1 小时前
飞凌精灵(ElfBoard)技术贴|如何在RK3506开发板上实现UART功能复用
大数据·linux·人工智能·驱动开发·单片机·嵌入式硬件·物联网
HackTorjan1 小时前
AI驱动的制品库高效管理:智能分类、自动化追踪与全生命周期优化
linux·人工智能·分类·自动化
.千余1 小时前
【Linux】进程概念
linux·服务器·开发语言·学习
蜡台1 小时前
centos 8 安装 nginx-1.29.8 及相关配置教程
linux·nginx·centos
爱学习的小囧1 小时前
ESXi性能历史怎么监控?2种方法,图形化+命令行全覆盖
java·linux·运维·服务器·网络·esxi·esxi8.0
sagima_sdu2 小时前
Codex 使用指南(技术向):App、CLI 与工作流接入
linux·运维·语言模型·json
圆山猫2 小时前
[Linux] 用 Buildroot 为 RISC-V QEMU 构建最小根文件系统
linux·运维·risc-v
小草儿7992 小时前
gbase8s之onatpe备份与恢复性能测试
linux·服务器·网络
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:雷达安装
c++·算法·贪心·csp·信奥赛·区间贪心·雷达安装