0
点赞
收藏
分享

微信扫一扫

软件设计师 - 第1章 计算机网络概论

Raow1 2024-11-12 阅读 9

文章目录


【Linux】vim gcc makefile


前言

一、Linux 编辑器 - vim

0. 简介

1. 多模式切换

在这里插入图片描述

2. 各模式常见指令操作

二、gcc 使用

三、项目自动化构建工具 - make/Makefile

1. 简介

2. 语法

# 目标文件 : 依赖文件列表(一整行称为依赖关系)
#			依赖方法

proc:proc.c
	gcc -o proc proc.c 

3. 特性

proc:proc.c
	gcc -o proc proc.c

4. 综合案例 - 进度条

4.1 预备知识

4.2 代码实现

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

int main()
{
    int count = 10;
    while(count >= 0)
    {
        printf("%-2d\r", count); // \r回车,但是没有换行,也就没有刷新
        fflush(stdout); 
        count--;
        sleep(1);
    }
    printf("\n"); //换行,防止命令行提示符覆盖掉最后的0
    return 0;
}
process:main.c process.c
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -f process
// --- process.h --- //
#pragma once
void FlushProcess(double total, double current);
// --- process.c --- //

#include "process.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <string.h>

#define NUM 101  //预留100个插入空间,剩下一个给‘/0’
#define STYLE '='
#define POINT '.'
#define SPACE ' '
const int pnum = 6;

// version 2:真实的进度条,应该根据具体的比如下载的量,来动态刷新进度
void FlushProcess(double total, double current)
{
    // 1. 更新当前进度的百分比
    double rate = (current/total)*100;

   // 2. 更新进度条主体
   char bar[NUM]; // 我们认为,1% 更新一个等号
   memset(bar, '\0', sizeof(bar)); //全部设置为\0,如有新内容插入就直接覆盖
								   // 可以使得printf打印完插入的内容就停止打印
   for(int i = 0; i < (int)rate; i++)
   {
       bar[i] = STYLE;
   }

   // 3. 更新旋转光标或者是其他风格
   static int num = 0;
   num++;
   num %= pnum; // %= 控制始终为 pnum长度的光标循环

   char points[pnum+1];
   memset(points, '\0', sizeof(points));
   for(int i = 0; i < pnum; i++)
   {
       if(i < num) points[i] = POINT;
       else points[i] = SPACE;
   }

   // 4. test && printf
	//单行动态显示 + 预留空间显示
   printf("[%-100s][%.1lf%%]%s\r", bar, rate, points);
   fflush(stdout);
   //sleep(1);
}
// --- main.c --- //

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include "process.h"

typedef void (*flush_t)(double total, double current);// 这是一个刷新的函数指针类型

const int base = 100;
double total = 2048.0; // 2048MB
double once = 0.1;     // 0.5MB

// 进度条的调用方式
void download(flush_t f)
{
    double current = 0.0;
    while(current < total)
    {
        // 模拟下载行为
        int r = rand() % base + 1; // [1, 10]
        double speed = r * once;
        current += speed;
        if(current >= total) current = total;
        usleep(10000);

        // 更新除了本次新的下载量
        // 根据真实的应用场景,进行动态刷新
        //Process(total, 1.0);
        f(total, current);
        //printf("test: %.1lf/%.1lf\r", current, total);
        //fflush(stdout);
    }
    printf("\n");
}

int main()
{
    srand(time(NULL));
    download(FlushProcess);

    return 0;
}

总结

举报

相关推荐

0 条评论