C語言進度條的實現原理詳解

\r和\n

在程序裡面,\r\n分別代表什麼意思?

\r:表示“回車”,即回到當前行的起始位置

\n:表示換行,即列不變,另其一個新行

行緩沖區

什麼是行緩沖區?先別慌,來看代碼一執行會是什麼樣的狀態。

//代碼一,mytest.c文件
# include <stdio.h>
int main(void)
{
  printf("hello linux");                                                                                                                                    
  sleep(1);
  return 0;
}

現象:光標休息一秒後,打印出hello linux。

那這個現象是不是說明瞭,sleep先執行,printf函數後執行呢?

並不是的,在執行sleep函數之前printf函數已經被執行瞭,隻是數據暫時存放到瞭行緩沖區內,沒有立即刷新出來。行緩存區隻有在輸入和輸出中遇到換行符時,緩沖區才立即刷新,然後把數據傳給磁盤,執行真正的I/O操作。

有瞭一個認知後

//代碼二,mytest.c文件
 # include <stdio.h>
 int main(void)
 {
   printf("hello linux\r");//添加瞭回車                                                                                                                                    
   sleep(1);
   return 0;
 }

因為內容被放到瞭行緩沖區內,刷新緩沖區的時候,hello linux本來是刷新出來瞭的,但是由於有一個\r回車符,然後又回到瞭行首的位置,導致數據被覆蓋瞭。所以休眠瞭一秒之後,什麼也沒有被顯示到屏幕上。

進度條

根據上面的行緩存區的知識

總結出進度條的一個制作方法:

假設以#作為進度條的一個顯示,第一次輸出#,立即刷新出來;利用\r回車的知識,第二次讓它回到改行行首的位置,輸出##,立即刷新出來;同樣的第三次回到該行行首,然後輸出###……

想法很美好,理論可以成功,開始實踐……

 # include <stdio.h>
 # include <string.h> //別忘記包含memset函數的頭文件
 int main(void)
 {
   char buffer[102]; //開辟一個能容納102個字符的數組
   memset(buffer, 0, sizeof(buffer));//將字符數組的每一個字節都初始化為0
   int i = 0;
   while(i <= 100)
   {
     printf("[%-100s][%d%%]\r", buffer, i); //控制輸出的格式
     fflush(stdout); //立即刷新標準輸出流                                                                                                                      
     buffer[i++] = '#'; //把i下標的空間初始化為#之後,++i
     usleep(50000); //因為usleep是毫秒為單位,進度條時間可以自己控制
   }                                      
   printf("\n");//最後的時候換個行更加美觀
   return 0;                              
 }                                        

實踐成功,達到瞭我預期的效果,perfect!

到此這篇關於C語言進度條的實現原理詳解的文章就介紹到這瞭,更多相關C語言進度條內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: