目錄
1.知識(shí)補(bǔ)充
1.1回車和換行?
1.2緩沖區(qū)
2.實(shí)現(xiàn)倒計(jì)時(shí)?
3.實(shí)現(xiàn)進(jìn)度條?
1.知識(shí)補(bǔ)充
1.在制作小程序進(jìn)度條之前,我們先了解一下,回車換行和行緩沖區(qū)的概念。
2.動(dòng)態(tài)效果,在同一個(gè)位置刷新不同的圖像,實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)的效果。
3.有了上面的基礎(chǔ)我們就可以實(shí)現(xiàn)進(jìn)度條了
1.1回車和換行?
所以說回車和換行是兩個(gè)動(dòng)作。
這是老式鍵盤。
在C語言中,\r表示的是只回車,\n表示的是只換行。
1.2緩沖區(qū)
看下面兩段代碼:
運(yùn)行這個(gè)代碼發(fā)現(xiàn):printf打印的內(nèi)容顯示三秒后程序結(jié)束
運(yùn)行這個(gè)代碼發(fā)現(xiàn):等待三秒后顯示printf打印的內(nèi)容程序結(jié)束
是因?yàn)橄旅孀舆@段代碼先執(zhí)行sleep函數(shù)嗎?當(dāng)然不是,C語言的代碼都是從上往下執(zhí)行的,那為什么下面的代碼是先暫停三秒然后才進(jìn)行打印的呢?
這是因?yàn)樵趕leep期間,字符串進(jìn)入了緩沖區(qū)。
緩沖區(qū)是計(jì)算機(jī)中用于臨時(shí)存儲(chǔ)數(shù)據(jù)的內(nèi)存區(qū)域。在輸入/輸出操作中,數(shù)據(jù)通常不會(huì)立即傳輸?shù)侥康牡兀窍却鎯?chǔ)在緩沖區(qū)中,以提高效率。緩沖區(qū)主要分為輸入緩沖區(qū)和輸出緩沖區(qū):
1. **輸入緩沖區(qū)**:用于存儲(chǔ)從輸入設(shè)備(如鍵盤、鼠標(biāo)、文件等)讀取的數(shù)據(jù),直到程序準(zhǔn)備處理這些數(shù)據(jù)。例如,當(dāng)你輸入文本時(shí),字符會(huì)被存儲(chǔ)在輸入緩沖區(qū)中,直到程序讀取并處理這些字符。
2. **輸出緩沖區(qū)**:用于存儲(chǔ)程序要發(fā)送到輸出設(shè)備(如屏幕、打印機(jī)、文件等)的數(shù)據(jù),直到達(dá)到一定條件時(shí)才會(huì)將數(shù)據(jù)發(fā)送到目的地。例如,當(dāng)程序使用 printf 函數(shù)打印文本時(shí),文本會(huì)先存儲(chǔ)在輸出緩沖區(qū)中,直到緩沖區(qū)滿了、遇到換行符或調(diào)用 fflush 函數(shù)時(shí)才會(huì)將數(shù)據(jù)刷新到屏幕上。
在前面的例子中,由于 printf 函數(shù)打印的文本被存儲(chǔ)在輸出緩沖區(qū)中,而在調(diào)用 sleep(3) 函數(shù)之前并沒有刷新緩沖區(qū),所以你會(huì)看到在暫停3秒后才會(huì)將文本顯示出來。這展示了緩沖區(qū)在程序執(zhí)行過程中的作用。緩沖區(qū)的使用可以提高I/O操作的效率,但有時(shí)也需要注意緩沖區(qū)的刷新以避免數(shù)據(jù)延遲顯示或丟失。
程序結(jié)束的時(shí)候,一般自動(dòng)沖刷緩沖區(qū)。緩沖區(qū)滿了也會(huì)進(jìn)行刷新。
包含\n之前的字符會(huì)立即刷新。
還有一種情況,我既不想緩沖區(qū)滿了才刷新,我也不想帶\n進(jìn)行刷新,該怎么辦呢?
如果你想在不等待緩沖區(qū)滿了或不使用換行符的情況下立即刷新輸出緩沖區(qū),你可以使用 fflush(stdout) 函數(shù)來手動(dòng)刷新標(biāo)準(zhǔn)輸出緩沖區(qū)。這樣可以確保緩沖區(qū)中的內(nèi)容立即被輸出到屏幕上,而不必等待緩沖區(qū)滿或遇到換行符。以下是一個(gè)示例代碼:
這個(gè)示例中, fflush(stdout) 函數(shù)用于手動(dòng)刷新標(biāo)準(zhǔn)輸出緩沖區(qū),確保在暫停3秒之前將文本立即顯示在屏幕上。這樣你就可以在需要時(shí)控制何時(shí)刷新輸出緩沖區(qū),而不必等待緩沖區(qū)滿或使用換行符。
2.實(shí)現(xiàn)倒計(jì)時(shí)?
?如何實(shí)現(xiàn)倒計(jì)時(shí)?
在同一個(gè)位置不斷的刷新數(shù)字,如何做到?
輸出一個(gè)數(shù)字,然后使用回車重新回到原來的位置(為了讓數(shù)字變動(dòng)的慢一些,我們?cè)O(shè)置sleep為1s,代碼示例:
我們運(yùn)行代碼發(fā)現(xiàn),什么數(shù)字都沒有顯示,程序10s后結(jié)束,這是因?yàn)槌霈F(xiàn)在緩沖區(qū)還沒有刷新就被覆蓋掉了,所有我們要使用fflush函數(shù)刷新緩沖區(qū)
這樣程序就有倒計(jì)時(shí)的效果了。
但如果是超過一個(gè)位數(shù)的這是就要控制回車移動(dòng)的位置了:
eg:20s倒計(jì)時(shí)
3.實(shí)現(xiàn)進(jìn)度條?
準(zhǔn)備工作:
第一個(gè)文件負(fù)責(zé)進(jìn)度條功能的實(shí)現(xiàn),第二個(gè)文件負(fù)責(zé)進(jìn)度條功能的聲明,第三個(gè)文件負(fù)責(zé)進(jìn)度條的運(yùn)行測(cè)試。Makefile負(fù)責(zé)進(jìn)度條的自動(dòng)化構(gòu)建。
什么樣的進(jìn)度條:
我們?cè)诘谝粋€(gè)位置預(yù)留100個(gè)字符的空間(顯示進(jìn)度條在增加),第二個(gè)位置顯示進(jìn)度,第三個(gè)位置有一個(gè)旋轉(zhuǎn)的光標(biāo)以表示在加載中。。。
首先定義一個(gè)char數(shù)組,memset全初始化為"\0",這時(shí)我們就一個(gè)一個(gè)的往數(shù)組中填寫”#"
(間隔1s)表示進(jìn)度條的增加
初步效果:確實(shí)在增加,但我們只需要他在一行中不斷的打印
我們通過回車去覆蓋,然后讓緩沖區(qū)不斷的刷新,這就有了只在一行中不斷增加的效果
+、
我們?cè)谶\(yùn)行的過程中發(fā)現(xiàn)1s的間隔太慢,在這里我們將sleep函數(shù)換成(usleep)函數(shù),間隔單位為微秒。(這里間隔換算為秒為:0.02s)
我們?cè)陲@示的時(shí)候發(fā)現(xiàn),進(jìn)度條的框是隨著進(jìn)度的增加而變大的,這樣的效果不太好看,因此我們直接預(yù)留100字符大小的框,這時(shí)我們?cè)俅蛴〉臅r(shí)候就會(huì)發(fā)現(xiàn)框是有100個(gè)字符“#”的長度,但是進(jìn)度條是從右往左增加的,這時(shí)因?yàn)樽址J(rèn)是右對(duì)齊的,加上-變成左對(duì)齊。
這時(shí)候我們還可以在后面加上顯示進(jìn)度了百分之多少,在Linux中打印%,只需要輸入連續(xù)的兩個(gè)%:
最后我們將正在加載的效果顯示出來:原理和倒計(jì)時(shí)一樣,為了達(dá)到旋轉(zhuǎn)的效果,我們將用幾個(gè)方向的線順序的出現(xiàn)來達(dá)到旋轉(zhuǎn)的視覺效果
在這里模len是為了防止數(shù)組的越界
這時(shí)就有了旋轉(zhuǎn)的效果了。文章來源:http://www.zghlxwxcb.cn/news/detail-833122.html
完整代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-833122.html
#include <unistd.h> #include <string.h> int main() { int i = 0; char bar[102]; memset(bar, 0, sizeof(bar)); const char* lable = "|/-\\"; while (i <= 100) { printf("[%-100s][%d%%][%c]\r", bar, i, lable[i % 4]); fflush(stdout); bar[i++] = '#'; usleep(10000); } printf("\n"); return 0; }
到了這里,關(guān)于Linux小程序--進(jìn)度條的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!