0
点赞
收藏
分享

微信扫一扫

【Linux】从零开始认识动静态库 - 静态库

图片名称

🎉博主首页: 有趣的中国人

🎉专栏首页: Linux

🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构


在这里插入图片描述

文章目录



1. 关于回车 & 换行




👨‍💻回车换行的概念


在Unix和类Unix系统(如LinuxmacOS)中通常使用换行字符(“\n”)来表示换行。

在Windows系统中:通常使用回车和换行的组合来表示换行,即"\r\n"。



2. 简述缓冲区



👨‍💻缓冲区何时被清理

拿C语言举个例子:

在C语言中,标准库函数printf()用于将格式化的数据打印到标准输出流(通常是终端)。但是,printf()函数并不会立即将数据显示到终端上。相反,它会将数据写入到输出缓冲区中。输出缓冲区是一个临时存储区域,用于存放printf()函数打印的数据,直到满足一定条件时才将其刷新(即将数据发送到终端并显示出来)。

这些条件包括:



3. 倒计时程序的编写


有了以上的知识储备,咱们就可以尝试编写一下简单的倒计时程序了,思路如下:

  • 首先新建一个time.c文件,然后再用我们之前讲的makefile工具来实现time.c文件的自动构建:

在这里插入图片描述

  • 编写time.c这个文件,实现思路:

🌝详细代码如下:

#include <stdio.h>
#include <unistd.h>
int main()
{
    int cnt = 10;

    while(cnt >= 0)
    {
    	// 打印的时候每次覆盖上一次出现的数字
        printf("倒计时:%2d\r",cnt);
        // 强制冲刷缓冲区
        fflush(stdout);
       --cnt;
        sleep(1);
    }
    printf("\n");
    return 0;
}

  • make命令进行编译:(⏳这边就可以动态运行了哈,感兴趣的可以自己试一下⌛)

在这里插入图片描述

  • 这里有个小拓展,如果我们要覆盖上次的数字是4位,这次是三次(比如1000到999),可以用%4d这个输出形式来解决,也可以用下面这种方法:
#include <stdio.h>
#include <unistd.h>
int main()
{
    int cnt = 1000;
    int tmp = cnt;
    int num = 0;
    while (tmp)
    {
        ++num;
        tmp /= 10;
    }
    while(cnt >= 0)
    {
    	// 主要就是这里的变化,用最大数字的位数来做占位符
        printf("倒计时:%*d\r",num, cnt);
        fflush(stdout);
       --cnt;
        sleep(1);
    }
    printf("\n");
    return 0;
}



4. 简易进度条的实现




👨‍💻效果图展示

👨‍💻实现思路


1. 动态加载的过程


2. 进度加载


3. 动态旋转


👨‍💻具体代码实现

#include "process_bar.h"
#include <memory.h>
#include <unistd.h>
#define style '#'
#define round "-\\/-"
void test()
{
    int i = 0;
    char str[100];
    memset(str,'\0',sizeof(str));
    while (i <= 100)
    {
        str[i] = style;
        printf("[%-100s][%d%%][%c]\r",str,i,round[i % 4]);
        fflush(stdout);
        ++i;
        usleep(10000);
    }
    printf("\n");
}

在这里插入图片描述



👨‍💻第二版本


对于要下载的文件,肯定有文件大小,下载的时候网络也有它的带宽,所以在下载的时候,每次下载的大小都是一个带宽,我们可以先写一个下载的函数:

download函数:

void download()
{
   double bandwidth = 1024 * 1024 * 1.0;
   double filesize = 1024 * 1024 * 10.0;
   double cur = 0.0;
   while (cur <= filesize)
   {
   	   // 调用进度条函数
       test(filesize, cur);
       // 每次增加带宽
       cur += bandwidth;
       usleep(20000);
   }
   printf("\n");
   printf("this file has been downloaded\n");
}

进度条函数:

void test(double total, double current)
{
    char str[101];
    memset(str,'\0',sizeof(str));
    int i = 0;
    // 这次的比率
    double rate = (current * 100) / total;
    // 循环次数
    int loop_count = (int)rate;
    while (i <= loop_count)
    {
        str[i++] = style; 
    }
    printf("[%-100s][%.1lf%%][%c]\r",str,rate,round[loop_count % 4]);
    fflush(stdout);
}

回调函数版本(完整):

// 头文件 process_bar.h
#include <stdio.h>

typedef void(*callback_t)(double, double);// 函数指针(回调函数)

void test(double total, double current);

// 函数实现文件 process_bar.c
#include "process_bar.h"
#include <memory.h>
#include <unistd.h>
#define style '#'
#define round "-\\/-"

void test(double total, double current)
{
    char str[101];
    memset(str,'\0',sizeof(str));
    int i = 0;
    double rate = (current * 100) / total;
    int loop_count = (int)rate;
    while (i <= loop_count)
    {
        str[i++] = style; 
    }
    printf("[%-100s][%.1lf%%][%c]\r",str,rate,round[loop_count % 4]);
    fflush(stdout);
}

// main.c 主函数和 download 函数
#include "process_bar.h"
#include <unistd.h>

double bandwidth = 1024 * 1024 * 1.0;
void download(double filesize, callback_t cb)
{
   double cur = 0.0;
   while (cur <= filesize)
   {
       cb(filesize, cur);
       cur += bandwidth;
       usleep(20000);
   }
   printf("\n");
   printf("this file has been downloaded\n");
}

int main()
{
    download(1024*1024*100.0,test);
    download(1024*1024*20.0,test);
      
    return 0;
}

在这里插入图片描述

举报

相关推荐

0 条评论