国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】第一個小程序--進(jìn)度條

這篇具有很好參考價值的文章主要介紹了【Linux】第一個小程序--進(jìn)度條。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這篇博客要綜合利用以前的知識,來實(shí)現(xiàn)一個進(jìn)度條程序~

目錄

換行&回車

緩沖區(qū)

實(shí)現(xiàn)簡單的倒計(jì)時

實(shí)現(xiàn)進(jìn)度條

version1

version2


?文章來源地址http://www.zghlxwxcb.cn/news/detail-838076.html

在開始寫這個小程序之前,我們先學(xué)習(xí)一些預(yù)備知識:

換行&回車

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

緩沖區(qū)

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

?在我們運(yùn)行這個程序時,并沒有直接打印出“hello bit,hello world...”,而是當(dāng)程序運(yùn)行結(jié)束后才顯示出來,但是這并不代表這句打印沒有執(zhí)行,而是沒有顯示出來而已。

那么,在我sleep期間,字符串在哪里?

答案就是被保存在叫做緩沖區(qū)的地方,就是一塊內(nèi)存空間,當(dāng)程序結(jié)束時,一般會自動刷新緩沖區(qū)到字符設(shè)備(顯示器),另外,如果程序遇到‘\n’的時候,也會刷新緩沖區(qū)。如果想要強(qiáng)制刷新,可以使用fflush命令。

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

那么,為什么要有緩沖區(qū)呢,為什么按行刷新?為了提高效率,方便人類閱讀,人類讀信息都是按行讀的,是一種尊重用戶的表現(xiàn)

?實(shí)現(xiàn)簡單的倒計(jì)時

在實(shí)現(xiàn)倒計(jì)時中,我們想要達(dá)到的效果是依次顯示數(shù)字,并且下一個覆蓋前一個數(shù)字,創(chuàng)建test.c文件:

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main()
  5 {
  6   int cnt=10;
  7   while(cnt >=0)
  8   {
  9     printf("倒計(jì)時:%2d\r",cnt);                                                                                                              
 10     fflush(stdout);
 11     cnt--;
 12     sleep(1);
 13   }
 14   printf("\n");
 15 
 16   return 0 ;
 17 }

我們實(shí)現(xiàn)的效果是10,9,...1,0的倒計(jì)時效果,其中,

printf("倒計(jì)時:%2d\r",cnt);

這句代碼中\(zhòng)r是回車,在一次打印完成后,光標(biāo)回到最前面,繼續(xù)打印下一個值,覆蓋掉上一次的值,用%2d的格式打印的原因是,每次打印兩個字符,以防某個字符一直在屏幕上顯示。使用fflush(stdout)強(qiáng)制刷新到顯示器上。

此外,我們還寫了makefile自動化構(gòu)建工具:

 mycode:test.c
  2   gcc -o $@ $^
  3 .PHONY:clean
  4 clean:
  5   rm -f mycode

至此完成了簡單的倒計(jì)時效果。

實(shí)現(xiàn)進(jìn)度條

version1

在實(shí)現(xiàn)進(jìn)度條中,我們要創(chuàng)建三個文件:Processbar.h,Processbar.c,Main.c,Main.c負(fù)責(zé)將Processbar.h中的方法進(jìn)行調(diào)用,最終想達(dá)到的效果如下圖:

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

在Processbar.h中,我們定義了Process函數(shù)聲明;

#pragma once                                                                                                                                 
#include <stdio.h>
extern void Process();

在Processbar.c中實(shí)現(xiàn)了Process:

 #include "Processbar.h"
 #include <string.h>
 #include <unistd.h>

 #define Length 101
 #define Style '#'
 const char * label = "|/-\\";
 // version1
  void Process()
  {
     char bar[Length];
     memset(bar,'\0',sizeof(bar));
     int cnt = 0;
     int len =strlen(label);
     while(cnt <= 100)
     {
        printf("[%-100s][%3d%%][%c]\r",bar,cnt,label[cnt%len]);
        fflush(stdout);   
        bar[cnt++]=Style;
        usleep(20000);
     }
       printf("\n");
 }

在上面這段程序中,我們用bar數(shù)組來實(shí)現(xiàn)進(jìn)度條,大小Length設(shè)為101(包括最后的‘\0’),進(jìn)度條符號為‘#’。[%-100s]表示字符串靠左對齊,保證了‘#’從左邊往右增長。通過循環(huán)遍歷label所指向的數(shù)組來實(shí)現(xiàn)旋轉(zhuǎn)光標(biāo)的效果。

需要注意的是,因?yàn)槊看问褂谩甛r’來實(shí)現(xiàn)覆蓋的效果,但是‘\r’不能讓每次結(jié)果刷新到顯示器上,需要用fflush(stdout)來刷新。usleep()函數(shù)的單位是微秒(包含unistd.h頭文件)。

在Main.c中,調(diào)用Process.h:

#include "Processbar.h"                                                                                                                                                                      
int main()                                                                                  {                                                                                                                                                 
   Process();                                                                                                                                 
   return 0;                                                                                               
}    

最終的實(shí)現(xiàn)效果:

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

version2

上面我們單獨(dú)寫了一個進(jìn)度條程序,但是,進(jìn)度條會單獨(dú)出現(xiàn)嗎?肯定不會!它要和具體的場景結(jié)合。

假設(shè)我們要完成一個下載的場景:下載指定大小的文件,

在Main.c中,我們寫出download()這樣一個函數(shù):

   double bandwidth = 1024*1024*1.0;                                                                                                                        
   //download
   void download(double filesize,callback_t cb)
   {
     //double filesize = 100*1024*1024*1.0;
     double current = 0.0;
   
     printf("download begin,current:%lf\n",current);
      while(current <= filesize)
     {
        cb(filesize,current);
       //從網(wǎng)絡(luò)中獲取
       current += bandwidth;
       usleep(10000);
      }
      printf("\ndownload done,filesize:%lf\n",filesize);
    }

其中,bandwidth是我們假設(shè)的帶寬(可以理解為下載速度),download函數(shù)的filesize參數(shù)是我們要下載的文件大小,第二個參數(shù)是進(jìn)度條打印函數(shù),callback_t是函數(shù)指針,其定義在Processbar.h中,

typedef void(*callback_t)(double,double); 

在while循環(huán)中,根據(jù)filesize和current的大小,打印出當(dāng)前下載進(jìn)度的進(jìn)度條,打印完成后,繼續(xù)下載,current繼續(xù)增加,然后再打印下一次的進(jìn)度條并覆蓋之前的進(jìn)度條。

在Processbar.h中,有如下聲明:

#pragma once 
#include <stdio.h> 
typedef void(*callback_t)(double,double);                                                                                                                
void Process(double total,double current);

在Processbar.c中,定義了Process函數(shù):

//version2
void Process(double total,double current)
{
   char bar[Length];
   memset(bar,'\0',sizeof(bar));
   int cnt = 0;
   int len =strlen(label);
 
   double rate = current*100.0/total;
   int loop_count = (int)rate;                                                                                                                            
   while(cnt <= loop_count)
   {
     bar[cnt++]=Style;
   }
   printf("[%-100s][%.1lf%%][%c]\r",bar,rate,label[cnt%len]);
   fflush(stdout);   
 }

根據(jù)總文件大小total和當(dāng)前已下載大小current,打印出當(dāng)前的進(jìn)度條,例如,當(dāng)total=100、current=36時,會打印出如下內(nèi)容:

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

在Main.c中,將Process函數(shù)作為實(shí)參傳給download()函數(shù),完成下載。

int main()
{
   download(100*1024*1024,Process);
   download(50*1024*1024,Process);                                                                                                                        
   download(80*1024*1024,Process);
   download(1*1024*1024,Process);
   download(18*1024*1024,Process);
   return 0;
}

?模擬下載了多個文件,其效果如下:

【Linux】第一個小程序--進(jìn)度條,Linux,linux,小程序,運(yùn)維

?

到了這里,關(guān)于【Linux】第一個小程序--進(jìn)度條的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux第一個小程序進(jìn)度條

    Linux第一個小程序進(jìn)度條

    ? 在寫進(jìn)度條程序之前我們需要介紹一下緩沖區(qū),緩沖區(qū)有兩種,輸入和輸出緩沖區(qū),這里主要介紹輸出緩沖區(qū)。在我們用C語言寫代碼時,輸出一些信息,實(shí)際上是先輸出到輸出緩沖區(qū)里,然后才輸出到我們的顯示器上。 原因是: 如果輸出一個字符就打印到顯示器上,那么

    2024年02月05日
    瀏覽(19)
  • 【Linux】編寫第一個小程序:進(jìn)度條

    【Linux】編寫第一個小程序:進(jìn)度條

    1.1.1 sleep() 作用:讓程序休眠指定秒數(shù),如: sleep(3); //讓程序休眠3秒 與 Windows 上的 Sleep() 函數(shù)不同 需要包含頭文件 unistd.h 1.1.2 fflush() 作用:刷新緩沖區(qū) 需要傳入一個流 需要包含頭文件 stdio.h 1.1.3 usleep() 作用:讓程序休眠指定微秒,如: usleep(100000); //讓程序休眠100000微秒(

    2024年02月02日
    瀏覽(22)
  • linux第一個小程序 --- 進(jìn)度條【簡潔】

    linux第一個小程序 --- 進(jìn)度條【簡潔】

    結(jié)果:先輸入hello world然后休眠三秒后結(jié)束 當(dāng)去掉’\\\'n“ 后,結(jié)果就變成了先休眠三秒,然后打印hello world后結(jié)束。 該現(xiàn)象就證明了緩沖區(qū)的存在。 當(dāng)緩沖區(qū)中遇到’‘n’\\\'或者緩沖區(qū)被寫滿后才會被打印出來,在第二張圖片里面,沒有n,所以hello world先被寫入緩存區(qū),然后

    2024年01月20日
    瀏覽(18)
  • Linux第一個小程序-進(jìn)度條(c語言版)

    Linux第一個小程序-進(jìn)度條(c語言版)

    目錄 行緩沖區(qū)概念: 行緩沖區(qū)代碼演示: ?編輯進(jìn)度條代碼 1:memset函數(shù): 2:const char* lable=\\\"|/-\\\\\\\";? 3:usleep C語言?usleep?函數(shù)的功能和用法: 4:進(jìn)度條代碼的實(shí)現(xiàn).c文件與.h文件: ?編輯?編輯5:運(yùn)行截圖 ?編輯進(jìn)度條代碼的實(shí)用性優(yōu)化 優(yōu)化1:processbar函數(shù)內(nèi)部循環(huán)改為

    2024年01月15日
    瀏覽(16)
  • 【Linux】從0到1實(shí)現(xiàn)一個進(jìn)度條小程序

    【Linux】從0到1實(shí)現(xiàn)一個進(jìn)度條小程序

    個人主頁:??在肯德基吃麻辣燙 我的gitee:gitee倉庫 分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處 進(jìn)度條實(shí)現(xiàn): 本文講解如何從0到1實(shí)現(xiàn)一個進(jìn)度條小程序。 我們在寫作文的時候,寫到了一行的結(jié)尾,就得另起一行并到開頭繼續(xù)寫。 其中,這個另起一行的動作

    2024年02月14日
    瀏覽(27)
  • 《Linux從練氣到飛升》No.07 Linux第一個小程序-進(jìn)度條的實(shí)現(xiàn)

    《Linux從練氣到飛升》No.07 Linux第一個小程序-進(jìn)度條的實(shí)現(xiàn)

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數(shù)據(jù)結(jié)構(gòu)從0到1 探秘Linux 菜鳥刷題集 ??歡迎關(guān)注:??點(diǎn)贊??收藏??留言 ?? 碼字不易,你的??點(diǎn)贊??收藏??關(guān)注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。。?前面幾章我們講述了Linux指令、權(quán)限管理、編輯器

    2024年02月14日
    瀏覽(30)
  • 【Linux】:Linux項(xiàng)目自動化構(gòu)建工具——make/Makefile || Linux第一個小程序——進(jìn)度條(簡單版本)

    【Linux】:Linux項(xiàng)目自動化構(gòu)建工具——make/Makefile || Linux第一個小程序——進(jìn)度條(簡單版本)

    在本章開始給大家分享一個圖片 希望對你有幫助 在這里插入圖片描述 在開始本章之前 我們需要回顧一下上節(jié)課的函數(shù)的動靜態(tài)庫的優(yōu)缺點(diǎn) 動態(tài)庫的優(yōu)點(diǎn): 比較節(jié)省資源(這里說的資源不僅僅是磁盤資源 也包括網(wǎng)絡(luò)資源 內(nèi)存資源等等),不會出現(xiàn)太多的重復(fù)代碼 缺點(diǎn):對

    2024年02月05日
    瀏覽(39)
  • 【Linux】:使用git命令行 || 在github創(chuàng)建項(xiàng)目 || Linux第一個小程序——進(jìn)度條(進(jìn)階版本)

    【Linux】:使用git命令行 || 在github創(chuàng)建項(xiàng)目 || Linux第一個小程序——進(jìn)度條(進(jìn)階版本)

    在本章開始之前還是先給大家分享一張圖片 這是C++的筆試題 感興趣的同學(xué)可以去試一試 有難度的喲 也可以直接在??途W(wǎng)直接搜索這幾道題目哈 好了今天我們正式進(jìn)入我們的正題部分 安裝git 使用 Github 創(chuàng)建項(xiàng)目 注冊賬號 創(chuàng)建項(xiàng)目 ??1. 登陸成功后, 進(jìn)入個人主頁, 點(diǎn)擊左下

    2024年02月05日
    瀏覽(23)
  • 【Linux】Linux小程序-進(jìn)度條

    【Linux】Linux小程序-進(jìn)度條

    目錄 ????????一、r和n的理解 ????????二、行緩沖區(qū)概念 ????????三、進(jìn)度條源代碼 r:回車; n:換行; ? ? 那么請問這兩個有什么區(qū)別呢? ? ? 比如:我們在編寫內(nèi)容的時候,一行沒有寫完的情況下,需要換到下一行的開始位置,此時需要兩個步驟: ? ?

    2024年02月06日
    瀏覽(18)
  • Linux小程序--進(jìn)度條

    Linux小程序--進(jìn)度條

    目錄 1.知識補(bǔ)充 1.1回車和換行? 1.2緩沖區(qū) 2.實(shí)現(xiàn)倒計(jì)時? 3.實(shí)現(xiàn)進(jìn)度條? 1.在制作小程序進(jìn)度條之前,我們先了解一下,回車換行和行緩沖區(qū)的概念。 2.動態(tài)效果,在同一個位置刷新不同的圖像,實(shí)現(xiàn)一個倒計(jì)時的效果。 3.有了上面的基礎(chǔ)我們就可以實(shí)現(xiàn)進(jìn)度條了 所以說回車

    2024年02月21日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包