当前位置: 代码网 > 服务器>服务器>Linux > 【Linux】编写第一个小程序:进度条

【Linux】编写第一个小程序:进度条

2024年07月28日 Linux 我要评论
学习Linux的第一个偏系统层的小程序。


在这里插入图片描述

1. 预备知识

1.1 简单认识几个函数

1.1.1 sleep()

unsigned int sleep(unsigned seconds);

1.1.2 fflush()

int fflush(file* stream);

1.1.3 usleep()

int usleep(useconds_t usec);

1.1.4 memset()

void* memset(void* ptr, int value, size_t num);

1.2 缓冲区

直接上代码观察现象

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("you can see me       ");
    sleep(3);
    return 0;
}

执行效果图

在这里插入图片描述

1.3 回车与换行

首先我要抛出一个概念:回车和换行是不一样的!

在这里插入图片描述

在这里插入图片描述

2. 编写入门版的进度条

2.1 基本逻辑

在这里插入图片描述

2.2 美化效果

在这里插入图片描述

2.3 代码实现

// porcessbar.h

#pragma once

#include <stdio.h>

#define num 103
#define body '='
#define head '>'

// version 1
void process();
// processbar.c

#include "processbar.h"
#include <string.h>
#include <unistd.h>

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

// version 1
void process()
{
    char buffer[num];
    memset(buffer, '\0', sizeof(buffer));
    int cnt = 0;
    int n = strlen(lable);
    buffer[0] = head;
    while (cnt <= 100)
    {
        printf("[%-100s][%3d%%][%c]\r", buffer, cnt, lable[cnt % n]);
        fflush(stdout);
        buffer[cnt++] = body;
        if (cnt < 100)
        {
            buffer[cnt] = head;
        }
        usleep(50000);
    }
    printf("\n");
}

2.4 执行效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 编写升级版的进度条

3.1 代码实现

// processbar.h

#pragma once

#include <stdio.h>

#define num 103
#define body '='
#define head '>'

typedef void (*callback_t)(double);		// 函数指针类型

// version 2
void process_flush(double rate);
// processbar.c

#include "processbar.h"
#include <string.h>
#include <unistd.h>

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

// version 2: 进度是多少,你进度条能知道吗?另外,什么进度?依附于其他应用的,比如下载
char buffer[num] = {0};
void process_flush(double rate)
{
    static int cnt = 0;
    int n = strlen(lable);
    if (rate <= 1.0)
    {
        buffer[0] = head;
    }
    printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt % n]);
    fflush(stdout);

    buffer[(int)rate] = body;
    if ((int)rate + 1 < 100)
    {
        buffer[(int)(rate + 1)] = head;
    }
    if (rate >= 100.0)
    {
        printf("\n");
    }

    cnt++;
    cnt %= n;
}
// main.c

#include "processbar.h"
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

// 模拟文件大小
#define filesize (1024 * 1024 * 1024)

// 模拟一种场景,表示一种下载任务
void download(callback_t cb)    // 回调函数的形式
{
    srand(time(null) ^ 1023);   // 这样写只是为了让随机数更随机
    int total = filesize;
    while (total)
    {
        usleep(10000);  // 下载动作
        int one = rand() % (1024 * 1024);  // 一次下载的大小
        total -= one;
        if (total < 0)
        {
            total = 0;
        }

        // 当前的进度是多少?
        int download = filesize - total;
        double rate = (download * 1.0 / filesize) * 100.0;
        cb(rate);
    }
}

int main()
{
    download(process_flush);
    return 0;
}

3.2 执行效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


end
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com