溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么

發(fā)布時(shí)間:2022-08-29 16:48:05 來(lái)源:億速云 閱讀:118 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么”,在日常操作中,相信很多人在C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

\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操作。

C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么

有了一個(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)有被顯示到屏幕上。

C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么

進(jìn)度條

根據(jù)上面的行緩存區(qū)的知識(shí)

總結(jié)出進(jìn)度條的一個(gè)制作方法:

假設(shè)以#作為進(jìn)度條的一個(gè)顯示,第一次輸出#,立即刷新出來(lái);利用\r回車的知識(shí),第二次讓它回到改行行首的位置,輸出##,立即刷新出來(lái);同樣的第三次回到該行行首,然后輸出###&hellip;&hellip;

想法很美好,理論可以成功,開(kāi)始實(shí)踐&hellip;&hellip;

 # include <stdio.h>
 # include <string.h> //別忘記包含memset函數(shù)的頭文件
 int main(void)
 {
   char buffer[102]; //開(kāi)辟一個(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!

C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么

到此,關(guān)于“C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI