C語言進度條的實現(xiàn)原理詳解
\r和\n
在程序里面,\r和\n分別代表什么意思?
\r:表示“回車”,即回到當(dāng)前行的起始位置
\n:表示換行,即列不變,另其一個新行
行緩沖區(qū)
什么是行緩沖區(qū)?先別慌,來看代碼一執(zhí)行會是什么樣的狀態(tài)。
//代碼一,mytest.c文件
# include <stdio.h>
int main(void)
{
printf("hello linux");
sleep(1);
return 0;
}現(xiàn)象:光標(biāo)休息一秒后,打印出hello linux。
那這個現(xiàn)象是不是說明了,sleep先執(zhí)行,printf函數(shù)后執(zhí)行呢?
并不是的,在執(zhí)行sleep函數(shù)之前printf函數(shù)已經(jīng)被執(zhí)行了,只是數(shù)據(jù)暫時存放到了行緩沖區(qū)內(nèi),沒有立即刷新出來。行緩存區(qū)只有在輸入和輸出中遇到換行符時,緩沖區(qū)才立即刷新,然后把數(shù)據(jù)傳給磁盤,執(zhí)行真正的I/O操作。

有了一個認知后
//代碼二,mytest.c文件
# include <stdio.h>
int main(void)
{
printf("hello linux\r");//添加了回車
sleep(1);
return 0;
}因為內(nèi)容被放到了行緩沖區(qū)內(nèi),刷新緩沖區(qū)的時候,hello linux本來是刷新出來了的,但是由于有一個\r回車符,然后又回到了行首的位置,導(dǎo)致數(shù)據(jù)被覆蓋了。所以休眠了一秒之后,什么也沒有被顯示到屏幕上。

進度條
根據(jù)上面的行緩存區(qū)的知識
總結(jié)出進度條的一個制作方法:
假設(shè)以#作為進度條的一個顯示,第一次輸出#,立即刷新出來;利用\r回車的知識,第二次讓它回到改行行首的位置,輸出##,立即刷新出來;同樣的第三次回到該行行首,然后輸出###……
想法很美好,理論可以成功,開始實踐……
# include <stdio.h>
# include <string.h> //別忘記包含memset函數(shù)的頭文件
int main(void)
{
char buffer[102]; //開辟一個能容納102個字符的數(shù)組
memset(buffer, 0, sizeof(buffer));//將字符數(shù)組的每一個字節(jié)都初始化為0
int i = 0;
while(i <= 100)
{
printf("[%-100s][%d%%]\r", buffer, i); //控制輸出的格式
fflush(stdout); //立即刷新標(biāo)準輸出流
buffer[i++] = '#'; //把i下標(biāo)的空間初始化為#之后,++i
usleep(50000); //因為usleep是毫秒為單位,進度條時間可以自己控制
}
printf("\n");//最后的時候換個行更加美觀
return 0;
} 實踐成功,達到了我預(yù)期的效果,perfect!

到此這篇關(guān)于C語言進度條的實現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)C語言進度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++回溯法解決1到9之間插入加減或空使運算結(jié)果為100
編寫一個在1,2,…,9(順序不能變)數(shù)字之間插入+或-或什么都不插入,使得計算結(jié)果總是100的程序,并輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 1002021-10-10

