1.Makefile初认识
(1)Makefile内部结构的基本认识
(2)开始使用宏替换的进阶版本
(3)多文件的最终版本
BIN:可执行程序的别名
SRC = $(wildcart *.c):表示所有.c文件
OBJ = $(SRC: .c = .o):表示SRC下的所有.c文件转换成的.o文件
:把所有的.o文件转化成可执行程序
($@表示:$(BIN),$^表示:$(OBJ))
:表示把所有.c文件转化成.o文件
(上面这两步是一个栈的过程):也就是说,上面那两部会首先执行下一步,把.c文件转化成.o文件,然后才会把.o文件转化成可执行程序
2.缓冲区的理解
在3s的休眠区内,虽然是printf先执行,但结果是存在于缓冲区的位置, 没有在显示器上呈现出来。
对此的显现方法有
(1)程序结束的时候:缓冲区自动刷新
(2)添加“\n”可以刷新
(3)使用fflush(stdout);也可是使得显示器刷新。
3.进度条程序的实现
(1)Makefile
该处参考1.(3)多文件实现的最终版本
:不存在任何的空格
SRC = $(wildcard *.c)
2 OBJ = $(SRC:.c = .o)
3 BIN = processchar
4
5 $(BIN):$(OBJ)
6 gcc -o $@ $^
7 %.o:%c
8 gcc -c $< -std=c99
9 .PHONY:
10 clean:
11 rm -f $(OBJ) $(BIN)
(2) main.c(主程序)
1.规定下载占用的总内存
下载速度
目前下载内存
#include<stdio.h>
#include<unistd.h>
#include"process.h"
#define total 1024.0
#define speed 1.0
int main()
{
double current = 0;
while(current <= total)
{
FlushProcess(total,current);
usleep(3000);
current+=speed;
}
printf("\ndownload %.2lfMB Done\n",current-1);
}
(3)process.c(实现程序)process.h(声明函数)
process.h
#pragma
2 #include<stdio.h>
3
4 void FlushProcess(double total,double current);
process.c
1 #include"process.h"
2 #include<string.h>
3 #include<unistd.h>
4 #define STYLE '*'
5 #define NUM 101
6 void FlushProcess(double total,double current)
7 {
8 char buffe[NUM];
9 memset(buffe,0,sizeof(buffe));
10 char line[4] = "|/-\\";
11 int num = current*100/total;
12 for(int i = 0;i < num;i++)
13 {
14 buffe[i] = STYLE;
15 }
16 double rate = current*100/total;
17 static int cnt = 0;
18 cnt%=3;
19 printf("[%-100s][%.1lf%%][%c]\r",buffe,rate,line[cnt]);
20 cnt++;
21 fflush(stdout);
22 }
1.memset:初始化buffe
2.\r:是回车,回到该行的第一行在进行输入,如果第一行有数据的话,那么输出上去的就会把原有的给覆盖掉。
3.fflush(stdout):
不加fflush就是全缓冲,全缓冲就是缓冲区写满自然就会打印了,然后一般来说,计算机都是非常快的,所以写满就是一下的事情,所以看起来就是刚刚现象了(光标迅速一个一个进行打印)
“缓冲区写满后的“自然打印””是不是就是体现在显示屏上的光标一个一个地打印
加了fflush的,则就是直接把缓冲区的内容直接搬上显示器进行显示