C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理詳解
\r和\n
在程序里面,\r
和\n
分別代表什么意思?
\r:表示“回車”,即回到當(dāng)前行的起始位置
\n:表示換行,即列不變,另其一個(gè)新行
行緩沖區(qū)
什么是行緩沖區(qū)?先別慌,來看代碼一執(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)象是不是說明了,sleep先執(zhí)行,printf函數(shù)后執(zhí)行呢?
并不是的,在執(zhí)行sleep函數(shù)之前printf函數(shù)已經(jīng)被執(zhí)行了,只是數(shù)據(jù)暫時(shí)存放到了行緩沖區(qū)內(nè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
本來是刷新出來了的,但是由于有一個(gè)\r
回車符,然后又回到了行首的位置,導(dǎo)致數(shù)據(jù)被覆蓋了。所以休眠了一秒之后,什么也沒有被顯示到屏幕上。
進(jìn)度條
根據(jù)上面的行緩存區(qū)的知識(shí)
總結(jié)出進(jìn)度條的一個(gè)制作方法:
假設(shè)以#
作為進(jìn)度條的一個(gè)顯示,第一次輸出#
,立即刷新出來;利用\r
回車的知識(shí),第二次讓它回到改行行首的位置,輸出##
,立即刷新出來;同樣的第三次回到該行行首,然后輸出###
……
想法很美好,理論可以成功,開始實(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)文章
利用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框的示例代碼
可擴(kuò)展對(duì)話框通常用于用戶對(duì)界面有不同要求的場(chǎng)合。當(dāng)供高級(jí)用戶使用或需要更多信息時(shí),可通過某種方式的切換顯示完整對(duì)話窗體(擴(kuò)展窗體)。本文將用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框,需要的可以參考一下2022-06-06Qt中QTextEdit限制只能輸入數(shù)字英文逗號(hào)
這篇文章主要給大家介紹了關(guān)于Qt中QTextEdit限制只能輸入數(shù)字英文逗號(hào)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06c++回溯法解決1到9之間插入加減或空使運(yùn)算結(jié)果為100
編寫一個(gè)在1,2,…,9(順序不能變)數(shù)字之間插入+或-或什么都不插入,使得計(jì)算結(jié)果總是100的程序,并輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 1002021-10-10C/C++實(shí)現(xiàn)遍歷文件夾最全方法總結(jié)
這篇文章主要為大家介紹了C/C++實(shí)現(xiàn)遍歷文件夾功能的最全方法總結(jié),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-09-09C++用easyx圖形庫(kù)實(shí)現(xiàn)障礙跑酷小游戲
這篇文章主要為大家詳細(xì)介紹了C++用easyx圖形庫(kù)實(shí)現(xiàn)障礙跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析
這篇文章主要介紹了C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02基于Qt實(shí)現(xiàn)簡(jiǎn)易GIF播放器的示例代碼
這篇文章主要介紹了如何利用Qt設(shè)計(jì)一個(gè)簡(jiǎn)易GIF播放器,可以播放GIF動(dòng)畫。其基本功能有載入文件、播放、暫停、停止、快進(jìn)和快退,感興趣的可以了解一下2022-06-06