??作者: 主頁
我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言
??碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?!
前言
前面幾章我們講述了Linux指令、權限管理、編輯器、編譯器、軟件包管理器、自動化管理工具,也寫了簡單的”Hello World“程序,但是沒有實現過復雜一點的程序,光說不練假把式,今天就帶大家來做一個小項目–進度條。
搭建框架
在寫代碼之前,我們先把文件先建好。
vim main.c
vim process.c
vim process.h
vim makefile
書寫代碼
在寫代碼要先講一個知識點。
1.回車換行
在我們日常使用回車鍵時,是否注意到,當我們按下回車鍵,也就是\n
,光標就會換到第二行的開始,其實這里面有兩個動作,換行和把光標設置到行開始,在C語言中可用\r
來把光標換到開始位置
我們來借此寫個小demo:倒計時void download() { int cnt=10; while(cnt!=0) { printf("%-2d\r",cnt); fflush(stdout); cnt--; sleep(1); } printf("\n"); }
效果如下:
第一版
我們最終要實現這個效果:
我們前面講了\r
可以把光標移到行始,所以在我們輸出緩存字符的時候,每一次都移到一開始的位置,隨著緩存字符的增多,來實現進度條的效果。
代碼如下:process.c
#include"process.h"
const char *lable="|/-\\";//通過循環(huán)實現一個轉動的效果
char bar[NUM];
void download(int speed)
{
char bar[NUM];//使用數組來存儲”緩存字符“
memset(bar,'\0',sizeof(bar));//初始化
int len =strlen(lable);
int cnt=0;
while(cnt<=TOP)//設置終止條件
{
printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);
//%-100s:預留100個空間左對齊
//%%:輸出%,也可以使用\%
//\r:把光標移到開始位置
fflush(stdout);//清空緩存區(qū)
bar[cnt++]=BODY;//將cnt所在位置設置為”BODY"
if(cnt<100)bar[cnt]=RIGHT;//設置>
usleep(speed);//控制進度條的速度,單位是微秒
}
printf("\n");
}
main.c
#include "process.h"
int main()
{
download(100000);
return 0;
}
process.h
#pragma once
#include<stdio.h>
#include <unistd.h>
#include<string.h>
#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'
extern void download(int speed);
makefile
process:process.c main.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f process
通過注釋,應該可以清楚明白代碼的實現原理,但是進度條該怎么用呢?這是一個問題,下面我們來模擬一下使用場景,只需要再修改一下代碼即可。
第二版
參考代碼注釋理解
main.c
#include "processBar.h"
typedef void (*callback_t)(int); // 函數指針類型
// 模擬一種安裝或者下載
void downLoad(callback_t cb)
{
int total = 1000; // 1000MB
int curr = 0; // 0MB
while(curr <= total)
{
// 模擬進行著某種下載的任務, 我
usleep(50000); // 模擬下載花費的時間
int rate = curr*100/total; // 更新進度
cb(rate); // 通過回調,展示進度
curr += 10; // 循環(huán)下載了一部分
}
printf("\n");
}
int main()
{
printf("donwnload 1: \n");
downLoad(processbar);
initbar();
printf("donwnload 2: \n");
downLoad(processbar);
initbar();
printf("donwnload 3: \n");
downLoad(processbar);
initbar();
printf("donwnload 4: \n");
downLoad(processbar);
initbar();
return 0;
}
processBar.h
#pragma once
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'
extern void processbar(int rate);
extern void initbar();
processBar.c
#include "processBar.h"
const char *lable="|/-\\";
char bar[NUM];
// 是如何被調用的
void processbar(int rate)
{
if(rate < 0 || rate > 100) return;
int len = strlen(lable);
printf("[%-100s]""[%d%%][%c]\r", bar, rate, lable[rate%len]); // 沒有\(zhòng)n,就沒有立即刷新,因為顯示器模式是行刷新
fflush(stdout);
bar[rate++] = BODY;
if(rate < 100) bar[rate] = RIGHT;
}
void initbar()
{
memset(bar, '\0', sizeof(bar));
}
makefile
processbar:processBar.c main.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f processbar
效果是一樣的,看到這里,我相信你對實現一個進度條已經非常了解了,但是有沒有覺得它有點不好看,那么我們再來優(yōu)化一下。
第三版
怎么修改?這里要了解一下怎么讓編譯器輸出顏色,可參考這篇文章
http://t.csdn.cn/O2T8F
只需修改processBar.c
文件即可
如下:
#include "processBar.h"
const char *lable="|/-\\";
char bar[NUM];
// 是如何被調用的
void processbar(int rate)
{
if(rate < 0 || rate > 100) return;
int len = strlen(lable);
printf("\033[38;2;128;0;128m\033[48;2;255;255;255m[%-100s][%d%%][%c]\033[m\r", bar, rate, lable[rate % len]);
fflush(stdout);
bar[rate++] = BODY;
if(rate < 100) bar[rate] = RIGHT;
}
void initbar()
{
memset(bar, '\0', sizeof(bar));
}
效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-627648.html
后記
本篇我們講述了如何在Linux上實現一個進度條,并對其進行了美化,但是我們的目的是通過做項目來把之前所學的相關知識串起來,我并沒有對它進行過多的講解,因為它本身并不難,難的是你在linux系統(tǒng)上編程的過程,但它也是最重要的!文章來源地址http://www.zghlxwxcb.cn/news/detail-627648.html
到了這里,關于《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!