?> 作者簡(jiǎn)介:?舊言~,目前大二,現(xiàn)在學(xué)習(xí)Java,c,c++,Python等
> 座右銘:松樹千年終是朽,槿花一日自為榮。> 目標(biāo):自己能實(shí)現(xiàn)進(jìn)度條
> 毒雞湯:
> 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲?????
??前言
????????咱們學(xué)習(xí)這么久的指令,一句話來概括,都忘光咯,學(xué)個(gè)錘錘??????,感覺白學(xué)了,博主也是感同身受,畢竟沒有相應(yīng)的練習(xí),很容易遺忘,咱們只要記住主要的指令就可以了,忘了或者不熟咱就查查文檔。今天捏我們用我們所學(xué)的知識(shí)編寫一個(gè)進(jìn)度條,看看下面:
QQ錄屏20231129162350
??前景知識(shí)一:\r和\n的理解
????????C語言會(huì)提供一些特殊的字符,比如說我們常用的\n,這個(gè)字符大家都不陌生,不就是換行嘛,這個(gè)我懂,但是還有一個(gè)字符\r,這個(gè)字符的作用是回車的意思。在這塊就有人說不都是一個(gè)意思嘛??,敲敲這些老鐵們的頭??,當(dāng)然不可能是一個(gè)意思。
??理解字符含意
\r(回車):
- 就是在第二行讓光標(biāo)跳到最開始的位置,這個(gè)操作就是回車。
\n(換行):
- 讓光標(biāo)從第一行跳到第二行,但是光標(biāo)只是垂直向下跳,并沒有在第二行的開始。這個(gè)操作就是換行。
直接說字符的意思就有一點(diǎn)抽象,咱們來個(gè)代碼看看??????
??代碼理解字符
\n(換行):代碼
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
\r(回車):代碼
#include<stdio.h>
int main()
{
printf("hello world\r");
return 0;
}
基于上面的原因我這不講解,在后面的緩沖區(qū)里面我們?cè)敿?xì)講解。
??前景知識(shí)二:認(rèn)識(shí)緩沖區(qū)
這里我們要知道什么是緩沖區(qū),咱可以看看官方用語:緩沖區(qū)處理 - Windows drivers | Microsoft Learn
簡(jiǎn)單來講就是:
- 在內(nèi)存中預(yù)留了一塊空間,用來緩沖輸入或輸出的數(shù)據(jù),這個(gè)保留的空間被稱為緩沖區(qū)。
??回顧回車和換行
咱們?cè)倏纯催@兩張圖片:
我們知道用 \n 的話就可以打印出來,而 \r,不能打印出來。
- 由于顯示器模式是行刷新緩沖區(qū)是按行緩沖的,沒有\(zhòng)n,就不能立即刷新。
- 由于\r 回到行首后,會(huì)進(jìn)行覆蓋寫,shell 提示符會(huì)覆蓋掉之前寫的 “hello world”。
??sleep和ffush理解
????????使用這個(gè)函數(shù)是在<unistd.h>庫(kù)中,使用它們需要包含頭文件 #include <unistd.h>,這里和緩沖區(qū)有什么關(guān)系??,因?yàn)樵谶M(jìn)度條中需要用到這兩函數(shù)。
咱們先看這些個(gè)函數(shù)的作用
- sleep:休眠函數(shù),單位是秒。
- usleep:休眠函數(shù),單位是ms(10﹣6?)
- fflush:刷新緩沖區(qū)
咱們來個(gè)簡(jiǎn)單的代碼看看這些函數(shù)作用:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello world\r");
//刷新緩沖區(qū)
fflush(stdout);
printf("\n");
//休眠三秒
sleep(3);
return 0;
}
??前景知識(shí)三:簡(jiǎn)單倒計(jì)時(shí)
實(shí)現(xiàn)進(jìn)度條咱們得先實(shí)現(xiàn)一下簡(jiǎn)單的倒計(jì)時(shí),為了給進(jìn)度條鋪墊,簡(jiǎn)單來講就是當(dāng)炮灰。
效果演繹:
全部代碼:
#include<stdio.h>
#include<unistd.h>
int main()
{
int cnt = 10;
while(cnt >= 0)
{
printf("%-2d\r",cnt);
fflush(stdout);
sleep(1);
cnt--;
}
printf("\n");
return 0;
}
過程分析:
- 定義倒計(jì)時(shí)變量 cnt,讓其逐漸遞降。
- 核心就是用 \r 回到緩沖區(qū)行首進(jìn)行覆蓋寫,然后fflush不斷刷新出出來。
- 格式調(diào)整,打印 cnt==10 時(shí),在緩沖區(qū)打印的其實(shí)是字符1和字符0,如果我們不用 2d% 來調(diào)整格式,而用 d% 的話,那么覆蓋寫只會(huì)覆蓋第一位字符 1 11 的位置,而第二位的字符 0 00, 還留在緩沖區(qū)原來的位置,于是倒計(jì)時(shí)便會(huì)變?yōu)橄旅孢@樣
??10->90->80->70->60->50->40->30->20->10->00 ,-2d% 加個(gè)負(fù)號(hào)保證其向左對(duì)齊 - 倒計(jì)時(shí)完加個(gè) \n符,shell 提示符就不會(huì)出現(xiàn)在倒計(jì)時(shí)后面。
??進(jìn)度條過程分析
原理:其原理就是不斷地覆蓋,然后將其像早以前的動(dòng)畫片一樣,變成一個(gè)動(dòng)畫。
- 第一個(gè)中括號(hào)就是表示進(jìn)度條。
- 第二個(gè)中括號(hào)表示進(jìn)度。
- 第三個(gè)表示旋轉(zhuǎn)樣式。
QQ錄屏20231129162350
game.h
#include<stdio.h>
#include<time.h>
#include<unistd.h>
void game(double rate);
void download();
game.c
#include"game.h"
#define MAX 1024*1024*1024
char* buff = "|/-\\";
int i = 0;
char arr[102] = { 0 };
void game(double rate)
{
if (rate <= 1.0)
{
arr[0] = '=';
}
printf("[%-100s][%.1lf%%][%c]\r", arr, rate, buff[i % 4]);
fflush(stdout);
arr[(int)rate] = '=';
if (rate< 99.0)
{
arr[(int)rate+1] = '>';
}
i++;
}
void download()
{
srand(time(NULL)^1023);
int max = MAX;
int cnt = 0;
double rate = 0;
while (rate<100.0)
{
cnt+= rand() % (1024*1024);
rate = ((cnt*1.0)/max)* 100;
if (rate > 100)
{
rate = 100;
}
game(rate);
usleep(50000);
}
}
test.c
?
#include"game.h"
int main()
{
download();
return 0;
}
?
makefile
all:test.o game.o
gcc -o $@ $^
test.o:test.c
gcc -c -o $@ $^
game.o:game.c
gcc -c -o $@ $^
.PHONY:clean
clean:
rm -rf *.o all
?
????結(jié)束語
? ? ? ?今天內(nèi)容就到這里啦,時(shí)間過得很快,大家沉下心來好好學(xué)習(xí),會(huì)有一定的收獲的,大家多多堅(jiān)持,嘻嘻,成功路上注定孤獨(dú),因?yàn)閳?jiān)持的人不多。那請(qǐng)大家舉起自己的小說手給博主一鍵三連,有你們的支持是我最大的動(dòng)力??????,回見。文章來源:http://www.zghlxwxcb.cn/news/detail-752160.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-752160.html
到了這里,關(guān)于Linux小程序之進(jìn)度條的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!