当前位置:   article > 正文

用Makefile实现进度条_make只显示进度

make只显示进度

缓冲区:

分为三种:空缓冲,行缓冲,全缓冲。

1.空缓冲: 没有缓冲,也就是信息在输入输出的时候,立马输入或输出。(eg:标准错误流stderr)

2.行缓冲: 当输入输出的时候,遇到换行才执行I/O操作。(eg:键盘的操作)

3.全缓冲: 当输入输出写满缓冲区才执行I/O操作。(eg:磁盘的读写)

几种情况及其现象:

1.

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

int main()
{
    printf("hehe ");
    sleep(3);                                                                        
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
现象:停了3秒之后显示hehe,并没有换行

2.

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

int main()
{
    printf("hehe \n");
    sleep(3);                                                                        
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
现象:直接显示hehe,换行,停了3秒之后,结束

(说明遇到了行缓冲,直接进行I/O)

3.

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

int main()
{
    printf("hehe");
    fprintf(stderr,"haha\n");
    sleep(3);
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
现象:先输出haha,停了3s后,输出hehe

(原因:printf是全缓冲,等;接着第二行是空缓冲,直接输出haha,等3s之后,第一行的hehe再输出)

4.

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

int main()
{
    printf("hehe\n");
    fprintf(stderr,"haha\n");
    sleep(3);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
现象:第一行是:行缓冲,直接输出hehe;第二行是:空缓冲,也直接输出haha;然后停3s结束

5.

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

int main()
{
    printf("hehe\n");
    sleep(3);
    fprintf(stderr,"haha\n");     
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
现象:先输出
hehe
  • 1
然后停三秒,再输出
haha
  • 1

进度条:


实现进度条使用的是printf函数,printf输出函数是一个行缓冲函数,先写到缓冲区,满足条件就将缓冲区刷到对应文件中。满足下列条件之一,缓冲区都会刷新:

(1)缓冲区填满

(2)写入的字符中有’\n”\r’

(3)调用fflush刷新缓冲区

(4)调用scanf从缓冲区获取数据时,也会刷新新缓冲区。

因为实现进度条用的是行缓冲(printf),所以我们需要使用缓冲区刷新函数fflush来输出。否则我们看到的进度条将是一段一段输出的。

其中:

区分 ‘\r’和”\n’:

‘\r’: 表示回车,每次回到行首

‘\n’: 表示换行,将光标指向下一行的开头位置

所以我们应该用的是’\r’.


用Makefile实现进度条:

main.c
#include "progressbar.h"                                                             

int main()
{
    char buf[102] = "#";
    char *r = "-/|-\\";
    ProgressBar(buf,r);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里写图片描述

progressbar.c
#include "progressbar.h"

void ProgressBar(char buf[],char *r) 
{
    int i = 0;
    while(i<=100)
    {   
        printf("\033[33m[%-100s][%d%%][%c]\033[0m\r",buf,i,r[i%5]);                  
        fflush(stdout);
        buf[i++] = '#';
        usleep(100000);
    }   
    printf("\n");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这里写图片描述

progressbar.h
#ifndef __PRB_H__                                                                    
#define __PRB_H__

#include <stdio.h>
#include <unistd.h>
#include <string.h>
void ProgressBar(char buf[],char *r);

#endif //__PRB_H__
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里写图片描述

Makefile:
.PHONY:main clean                                                                    
main: main.o progressbar.o
        gcc $^ -o $@
%.o : %.c 
        gcc -c $^ -o $@
clean:
        rm -rf *.o
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里写图片描述

输出结果:
其中运行./main之前,需要将字体先变小(Ctrl + -),然后放大窗口。否则出现的进度条是一段又一段的。

这里写图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/855596
推荐阅读
  

闽ICP备14008679号