赞
踩
我们所实现的进度条小程序的实质时在一定的空间内不断刷新元素的过程,并不是真正意义的增加
长度,因此我们需要先了解一些知识。
在真正写程序之前,我们需要知道‘\n’本身是代表换行(即向下移动一行,并不改变当前左右)
‘\r’代表回车(移动到当前行的最左侧)
而在Linux和C语言中‘\n’表示换行回车
缓冲区本身是一块内存空间,分为
而我们在linux中用c写进度条的代码时,实际上是行缓冲
对于这样一个代码,linux中会先sleep后打印,因为printf中的内容被临时存放在缓冲区中
但进度条程序不能使用’\n’的,此时我们使用fflush进行缓冲区的刷新
而C语言默认为我们打开了stdin,stdout,stderr,我们实际使用的是stdout(对应显示器)
由此上图代码块就是一个简易的倒计时,(因为是行刷新,如果没有fflush屏幕什么都不会打印)
makefile/make的使用也是基础重要的知识,不清楚的可以看这里
procbar:ProBar.c Main.c
gcc ProBar.c Main.c -o procbar
.PHONY:clean
clean:
rm -f procbar
进度条程序所需要的头文件
#pragma once
#include <stdio.h>
#include <unistd.h>
#define NUM 101
void progress_bar();
进度条源文件即函数实现部分,下面进行分析解释
#include "ProBar.h" void progress_bar() { char bar[NUM]; memset(bar, '\0', sizeof(bar)); int i = 0; const char* symbol = "| / -- \\"; while (i <= 100) { printf("[%-100s][%-3d%%][%c]\r", bar, i, symbol[i % 8]); fflush(stdout); bar[i++] = '='; usleep(30000); } printf("\n"); }
我们从上往下慢慢分析
首先需要初始化一个进度条本体的逐渐增多的框框
char bar[NUM];
memset(bar, '\0', sizeof(bar));
这里我们使用memset把数组元素初始化为’\0’(直接={0}也可以)
接下来是循环内部(进度条本体打印)
while (i <= 100)
{
printf("[%-100s][%-3d%%][%c]\r", bar, i, symbol[i % 8]);
fflush(stdout);
bar[i++] = '=';
usleep(30000);
}
const char* symbol = "| / -- \\";
当程序执行卡死可以有标志,此字符串通过构建一个持续转圈的小指标作为判断标志
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。