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