wordpress連接丟失百度seo關(guān)鍵詞排名推薦
前言? ?
? ? ? ? 在我們的日常生活中,進(jìn)度條是十分常見的,比如在軟件下載中,應(yīng)用加載中等等~~~那么進(jìn)度條有什么特點(diǎn)?他又如何實(shí)現(xiàn)。
下面我們將結(jié)合下面的圖展開講解
一、前置理論知識(shí)
1.1回車和換行的區(qū)別?
在我們的日常生活中,回車和換行似乎是相同的事情,但是事實(shí)上
- 回車:光標(biāo)回到當(dāng)前行的左端
- 換行:跳轉(zhuǎn)到當(dāng)前的下一行
- 在C語言中"\n"表示回車加換行,"\r"單單指的是回車;
PS:現(xiàn)在我們鍵盤上的ENTER同時(shí)兼?zhèn)淞嘶剀嚭蛽Q行的功能,
我們可以看到在老式的鍵盤中回車鍵的符號(hào)和對應(yīng)的形狀都是一個(gè)先向下再向左的箭頭。也就是說這一個(gè)鍵同時(shí)實(shí)現(xiàn)了兩個(gè)功能。
1.2緩存區(qū)的概念
在C語言中,緩存區(qū)是一種存儲(chǔ)空間,用于存儲(chǔ)程序中經(jīng)常使用的變量和數(shù)據(jù)。緩存區(qū)的目的是提高程序的運(yùn)行速度,當(dāng)程序需要訪問一個(gè)變量或數(shù)據(jù)時(shí),處理器會(huì)先檢查緩存區(qū)中是否存在該數(shù)據(jù)的副本,如果存在,則直接訪問緩存區(qū)中的數(shù)據(jù),而不是從內(nèi)存中讀取。這樣可以減少內(nèi)存訪問次數(shù),提高程序的執(zhí)行速度。
在C語言中會(huì)默認(rèn)打開三個(gè)輸入輸出的文件,分別是標(biāo)準(zhǔn)輸入流stdin,標(biāo)準(zhǔn)輸出流stdout,標(biāo)準(zhǔn)錯(cuò)誤stderr。
在我們平時(shí)的程序中,從程序中輸出的數(shù)據(jù)或者鍵盤上讀取的數(shù)據(jù)會(huì)先存到一個(gè)緩存區(qū)中,在需要時(shí)經(jīng)行讀取和截?cái)唷?#xff08;比如:在printf函數(shù)調(diào)用中輸入帶有空格的字符串,空格后的數(shù)據(jù)未被訪問,存入緩存區(qū))
1.2.1“\n”和“\r”在緩沖區(qū)中的作用效果差別
- 在Linux中我們經(jīng)常說一句話:萬物皆文件。也就是Linux系統(tǒng)認(rèn)為顯示器是文件,鍵盤是文件。在我們使用printf函數(shù)會(huì)將緩存區(qū)的數(shù)據(jù)讀取到顯示器上。
- 要注意的是顯示器默認(rèn)是行刷新,也就是當(dāng)輸出內(nèi)容配上“\n”后會(huì)直接回車+換行并立刻將內(nèi)容打印在屏幕上,待睡眠結(jié)束后,才會(huì)彈出操作框;
- 而當(dāng)輸出內(nèi)容配上“\r”后,其會(huì)先輸出到緩沖區(qū)中,待睡眠結(jié)束后才會(huì)和操作框一起輸出;
printf("hello Makefile!\n");先行打印,待睡眠結(jié)束后才彈出操作框printf("hello Makefile!\r");待睡眠結(jié)束后才會(huì)和操作框一起打印
1.2.2fflush函數(shù)
- fflush是一個(gè)在C語言標(biāo)準(zhǔn)輸入輸出庫中的函數(shù),功能是沖洗流中的信息,該函數(shù)通常用于處理磁盤文件。fflush()會(huì)強(qiáng)迫將緩沖區(qū)內(nèi)的數(shù)據(jù)寫回參數(shù)stream 指定的文件中。
- 在下面代碼塊中,"hello Makefile!"本來應(yīng)該待睡眠結(jié)束后才會(huì)和操作框一起彈出,在此之前存儲(chǔ)在緩沖區(qū)中;但我們用了fflush(stdout);(stdout是其數(shù)據(jù)類型),直接將內(nèi)容從緩沖區(qū)中寫回顯示器文件中;
- 最終完成的效果是:先行打印,待睡眠結(jié)束后才彈出操作框
#include <stdio.h>
int main()
{printf("hello Makefile!\r");fflush(stdout);sleep(3);return 0;
}
?二、Linux中的先行配置
在Linux中我們一般使用gcc命令去完成代碼的預(yù)處理、編譯、匯編、連接的工作。而對于一個(gè)多文件形成的程序我們通常使用Linux項(xiàng)目自動(dòng)化構(gòu)建工具-make/Makefifile。可以說會(huì)不會(huì)寫makefile反映出一個(gè)人有無能力去完成大型工程的能力。
雖然進(jìn)度條只由三個(gè)文件組成但是這不失為一種練習(xí)vim,makefile的手段。
- 用vim分別建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可視具體情況設(shè)置,文末有簡略代碼;
- makefile文件如圖所示
> - ./processbar 執(zhí)行程序
三、進(jìn)度條的重點(diǎn)部分
1、設(shè)計(jì)進(jìn)度條的主體部分
這里我們單獨(dú)實(shí)現(xiàn)進(jìn)度條功能,所以我們需要一個(gè)東西來模擬下載的速度從而讓進(jìn)度條以可以被觀測的方式來實(shí)現(xiàn)。
sleep/usleep(time)讓程序休眠time秒。每次休眠結(jié)束后更新進(jìn)度條,在運(yùn)行時(shí)就像進(jìn)度條真的在加載什么。
將進(jìn)度條顯現(xiàn)在屏幕上我們一般會(huì)用printf函數(shù),那么我們究竟需要展現(xiàn)什么?
以這個(gè)為例,我們需要一條代表下載進(jìn)度的線,表示已經(jīng)下載的百分比和一些動(dòng)態(tài)的符號(hào)表示程序的進(jìn)行。
進(jìn)度線:一個(gè)大小為102char數(shù)組(預(yù)留兩個(gè)位置放"\0")
百分比:一個(gè)int變量
動(dòng)態(tài)符號(hào):一個(gè)固定的字符串比如:| / - \,然后在
那么我們的初代主體代碼為
void processbar(int speed)
{char bar[102];const char *lable="|/-\\";memset(bar, '\0', sizeof(bar));int len =strlen(lable);int cnt=0;while(cnt <= 100){ printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);fflush(stdout); bar[cnt++]=BODY;if(cnt<100)bar[cnt]='>';usleep(speed);}printf("\n");
}
這里注意兩點(diǎn)一是 ‘ / ’ 的表示和‘ % ’ 的表示。
但是現(xiàn)實(shí)情況大多是傳入進(jìn)度來顯示進(jìn)度條。
所以我們將代碼經(jīng)行些許修改。?
四、完整代碼
#include"processbar.h" #include <string.h> #include <unistd.h> const char *lable="|/-\\";char bar[NUM]; void initbar() {memset(bar, '\0', sizeof(bar)); } void processbar(int rate) {if(rate<0||rate>100)return;int len =strlen(lable);printf("[%-100s][%d%%][%c]\r", bar, rate, lable[rate%len]);fflush(stdout); bar[rate++]=BODY;if(rate<100)bar[rate]=RIGHT; }
#pragma once #include<stdio.h> #define NUM 102//預(yù)留兩個(gè)位置放\0 #define TOP 100 #define BODY '-' #define RIGHT '>' extern void processbar(int speed); extern void initbar();
#include"processbar.h" #include<unistd.h> typedef void(*callback_t)(int); //模擬下載 void downLoad(callback_t cb) {initbar();int total = 100;//100mbint curr = 0;//0mbwhile(curr <= total){usleep(10000);//模擬下載時(shí)間int rate=curr*100/total;cb(rate);curr++;}printf("\n"); }int main() {downLoad(processbar);return 0; }