?????
?
前言
大家好吖,歡迎來(lái)到 YY 滴 Linux系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過(guò)Linux的老鐵,主要內(nèi)容含
歡迎訂閱 YY滴Linux專欄!更多干貨持續(xù)更新!以下是傳送門!
訂閱專欄閱讀: YY的《Linux》系列 ????? |
---|
【Linux】Linux環(huán)境搭建(新手指南,購(gòu)買,登錄)(1) |
【Linux】Linux基本指令大全-[詳解](2) |
【Linux】Linuxの權(quán)限與權(quán)限基本問(wèn)題-[詳解](3) |
【Linux】基礎(chǔ)開發(fā)工具—[yum]&[vim]詳解(4) |
【Linux】gcc&g++與 [ 動(dòng)靜態(tài)庫(kù) ] 的美妙邂逅(5) |
【Linux】自動(dòng)化構(gòu)建工具-make/Makefile詳解(6) |
【Linux】進(jìn)度條小程序の深度解剖(7) |
【Linux】從軟硬件角度重新理解 [ 操作系統(tǒng)與馮諾依曼體系 ](8) |
【Linux】程序員一定要了解的計(jì)算機(jī)管理理念——描述與組織(9) |
【Linux】操作系統(tǒng)管理的算珠——進(jìn)程の詳解(10) |
歡迎訂閱 YY滴C++專欄!更多干貨持續(xù)更新!以下是傳送門!
- YY的《C++》專欄
- YY的《C++11》專欄
- YY的《Linux》專欄
- YY的《數(shù)據(jù)結(jié)構(gòu)》專欄
- YY的《C語(yǔ)言基礎(chǔ)》專欄
- YY的《初學(xué)者易錯(cuò)點(diǎn)》專欄
- YY的《小小知識(shí)點(diǎn)》專欄
一.在Linux中的設(shè)置
- 用vim分別建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可視具體情況設(shè)置,文末有簡(jiǎn)略代碼;
- makefile文件如圖所示
> - ./processbar 執(zhí)行程序
細(xì)節(jié):為什么在makefile中不用包含頭文件?
- 頭文件就在源代碼的當(dāng)前目錄下,編譯器會(huì)自動(dòng)去找到頭文件
二.必備概念梳理
1.回車與換行的區(qū)別
- 回車:光標(biāo)回到當(dāng)前行的左端
- 換行:跳轉(zhuǎn)到當(dāng)前的下一行
- PS:現(xiàn)在我們鍵盤上的ENTER同時(shí)兼?zhèn)淞嘶剀嚭蛽Q行的功能,
- 在C語(yǔ)言中"\n"表示回車加換行,"\r"單單指的是回車;
2.緩沖區(qū)概念
引入: 緩沖區(qū)是C語(yǔ)言維護(hù)的一段內(nèi)存
C語(yǔ)言會(huì)默認(rèn)打開三個(gè)輸入輸出的文件,分別是標(biāo)準(zhǔn)輸入流stdin,標(biāo)準(zhǔn)輸出流stdout,標(biāo)準(zhǔn)錯(cuò)誤stderr
在進(jìn)度條小程序中,我們要特別注意標(biāo)準(zhǔn)輸出流stdout
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-740274.html
一.“\n”和“\r”在緩沖區(qū)中的作用效果差別
- 眾所周知,在Linux中,顯示器可以被當(dāng)作一個(gè)文件;
- 而且顯示器默認(rèn)是行刷新,也就是當(dāng)輸出內(nèi)容配上“\n”后會(huì)直接回車+換行并立刻將內(nèi)容打印在屏幕上,待睡眠結(jié)束后,才會(huì)彈出操作框;
- 而當(dāng)輸出內(nèi)容配上“\r”后,其會(huì)先輸出到緩沖區(qū)中,待睡眠結(jié)束后才會(huì)和操作框一起輸出;
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");先行打印,待睡眠結(jié)束后才彈出操作框
sleep(3);
return 0;
printf("hello Makefile!\r");待睡眠結(jié)束后才會(huì)和操作框一起打印
}
二.fflush函數(shù)
- fflush是一個(gè)在C語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)中的函數(shù),功能是沖洗流中的信息,該函數(shù)通常用于處理磁盤文件。fflush()會(huì)強(qiáng)迫將緩沖區(qū)內(nèi)的數(shù)據(jù)寫回參數(shù)stream 指定的文件中。
- 在下面代碼塊中,"hello Makefile!"本來(lái)應(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;
}
三.fflush函數(shù)的應(yīng)用:倒計(jì)時(shí)功能
1.倒計(jì)時(shí)功能的實(shí)現(xiàn)原理
- 利用不斷的回車和刷新實(shí)現(xiàn)
2.數(shù)據(jù)類型的表示細(xì)節(jié)
- 顯示2位數(shù)的數(shù)字 printf(“%2d\r”,cnt);
- 此時(shí)功能正常【10,9,8…1,0】
- 左對(duì)齊 printf(“%-2d\r”,cnt);
3.倒計(jì)時(shí)功能完整代碼
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt=10;倒計(jì)時(shí)功能
while(cnt>=0)
{
printf("%d\r",cnt); 此時(shí)屏幕出現(xiàn)【10,90,80...10,00】,功能異常;
fflush(stdout);
cut--;
sleep(1);
}
return 0;
}
三.設(shè)計(jì)進(jìn)度條的各個(gè)部分
1.設(shè)計(jì)進(jìn)度條主體部分
1.打印時(shí)為進(jìn)度條預(yù)留空間
- 設(shè)計(jì)一個(gè)字符數(shù)組,并初始化;此時(shí)其為一個(gè)空串;
memset(bar, 0 ,sizeof(bar));
2.調(diào)整進(jìn)度條主體加載方向
- 在Linux環(huán)境下, 行默認(rèn)是右對(duì)齊;所以隨著不斷的回車與換行,進(jìn)度條呈現(xiàn)出來(lái)的效果是自右向左移動(dòng);
- 我們只需要改為 [%-100s] 即可
printf("[%-100s]\r", bar);
3.進(jìn)度條主體部分代碼
#include <unistd.h>
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
while(i <= 100 )
{
printf("[%-100s]\r", bar);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
}
2.設(shè)計(jì)百分號(hào)進(jìn)度部分
一.設(shè)計(jì)細(xì)節(jié):“%如何表示”
- 細(xì)節(jié):由于【 % +''字母為 數(shù)據(jù)類型】,斜杠【%】用【%%】表示
二.實(shí)現(xiàn)原理
- while循環(huán)
int main()
{
int i = 0;
while(i <= 100 )
{
printf("[%d%%]",i);
fflush(stdout);
}
return 0;
}
3.設(shè)計(jì)旋轉(zhuǎn)光標(biāo)部分
一.設(shè)計(jì)細(xì)節(jié):“\ 如何表示”
- 細(xì)節(jié):由于【 \ +''為 轉(zhuǎn)義字符】,斜杠【\】用【\\】表示
二.實(shí)現(xiàn)原理
- 常量字符串配合上【 i++% 4】
- 【 -r 回車】 +【 fflush刷新圖標(biāo)】; 下一輪while循環(huán),直接覆蓋原來(lái)的字符,實(shí)現(xiàn)光標(biāo)轉(zhuǎn)動(dòng);
int main()
{
int i = 0;
const char *lable="|/-\\";
while(i <= 100 )
{
printf("[%c]\r",lable[i++%4]);
fflush(stdout);
}
}
四.進(jìn)度條完整代碼
#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;
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740274.html
到了這里,關(guān)于【Linux】進(jìn)度條小程序の深度解剖(7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!