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

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

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

到此這篇關(guān)于C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言進(jìn)度條內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Win10+VS2017新CUDA項(xiàng)目配置教程
這篇文章主要為大家詳細(xì)介紹了Win10+VS2017新CUDA項(xiàng)目配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
完美解決QT?QGraphicsView提升到QChartView報(bào)錯(cuò)的問(wèn)題
使用QT提供的QChartView來(lái)繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報(bào)錯(cuò)呢,下面小編給大家?guī)?lái)了QT QGraphicsView 提升到QChartView報(bào)錯(cuò)解決方案,感興趣的朋友一起看看吧2023-05-05
適合初學(xué)者的C語(yǔ)言轉(zhuǎn)義字符講解
轉(zhuǎn)義字符是很多程序語(yǔ)言、數(shù)據(jù)格式和通信協(xié)議的形式文法的一部分。對(duì)于一個(gè)給定的字母表,一個(gè)轉(zhuǎn)義字符的目的是開始一個(gè)字符序列,使得轉(zhuǎn)義字符開頭的該字符序列具有不同于該字符序列單獨(dú)出現(xiàn)(沒(méi)有轉(zhuǎn)義字符開頭)時(shí)的語(yǔ)義。因此轉(zhuǎn)義字符開頭的字符序列被叫做轉(zhuǎn)義序列2022-04-04
基于errno返回值的對(duì)應(yīng)錯(cuò)誤碼的詳細(xì)介紹
本篇文章是對(duì)errno返回值的對(duì)應(yīng)錯(cuò)誤碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++利用libcurl庫(kù)實(shí)現(xiàn)多線程文件下載
這篇文章主要為大家詳細(xì)介紹了C++如何利用libcurl庫(kù)實(shí)現(xiàn)多線程文件下載,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-01-01

